2017-07-27 57 views
0

在Swift 3中,如何在tableview中選擇多個選擇並保存它們?如果我移回去,我想看看我之前選擇的內容並更改它!我正在使用didSelectRowAtIndexPathdidDeselectRowAtIndexPath如何在桌面視圖中選擇並保存多個選擇

當我打開tableview並選擇行時,一切正常。我可以做出選擇並轉到下一個ViewController。但是當我移回到TableView時,我沒有看到我選擇的行並且無法更改我的選擇。

var selectedRows = Array<IndexPath>() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    subServicesTableView.allowsMultipleSelection = true 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SubServicesTableViewCell 

    cell.subServiceName.text = fetchedResultController.object(at: indexPath).name 

    if !selectedRows.isEmpty { 
     for row in selectedRows { 
      if row == indexPath { 
       cell.isSelected = true 
       cell.accessoryType = cell.isSelected ? .checkmark : .none 
      } 
     } 
    } 

    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let currentCell = subServicesTableView.cellForRow(at: indexPath) as! SubServicesTableViewCell 

    currentCell.chooseMark.backgroundColor = UIColor.green 
    selectedSubServices.append(fetchedResultController.object(at: indexPath)) 
    selectedRows.append(indexPath) 
} 

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 
    let currentCell = subServicesTableView.cellForRow(at: indexPath) as! SubServicesTableViewCell 
    currentCell.chooseMark.backgroundColor = UIColor.clear 
    selectedSubServices = selectedSubServices.filter(){$0 != fetchedResultController.object(at: indexPath)} 
    selectedRows = selectedRows.filter(){$0 != indexPath} 
} 

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    for index in selectedRows { 
     if index == indexPath { 

      self.subServicesTableView.selectRow(at: indexPath, animated: false, scrollPosition: .none) 
      if let serviveCell = cell as? SubServicesTableViewCell { 
       serviveCell.chooseMark.backgroundColor = UIColor.green 

      } 
     } 
    } 
} 
+0

您需要爲您的選擇引入某種持久性。你可以簡單地介紹一個單身人士,這個單身人士可以參考選擇。 – dirtydanee

回答

0

而是重新創建每次你的viewController加載時間selectedRows的,引入了單,你可以跟蹤你的選擇IndexPath實例。

下面是簡單的實現單例類的:

class RowsManager { 
    static let shared = RowsManager() 
    private init() {} 
    var selectedRows = Array<IndexPath>() 
} 

從現在開始,而不是用selectedRows交互,使用RowsManager.shared.selectedRows

使用單例是一種快速且相當簡單的解決方案。但是,iOS回聲系統中有許多持久性技術,如userdefaultsCore Data或寫入file system

0

你最好自己管理選擇狀態。當調用reloadData(),reloadSections...,reloadRowsAtIndexPaths...時,UITableView將清除選擇狀態。

爲您的站,它的系統行爲。 UIKit將自動取消選擇當用戶從細節視圖控制器中彈出時。

要重新使用它,只需存儲選擇狀態,並在需要時進行恢復。

var selections = [NSIndexPath]() 
    ... 
    ... 
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if !selections.contain(indexPath) { 
     selections.append(indexPath) 
    } 
}