2017-07-27 18 views
0

Swift 3では、テーブルビューで複数の選択肢を選択して保存するにはどうすればよいですか?私が前に戻ると、私が前に選んだものを見てそれを変えたい!私はdidSelectRowAtIndexPathdidDeselectRowAtIndexPathを使用しています。複数の選択をテーブルビューで選択して保存する方法

テーブルビューを開いて行を選択すると、すべてOKです。私は自分の選択をして、次の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

代わりのselectedRowsあなたのViewControllerがロードされるたびに再作成、あなたが選択したIndexPathインスタンスを追跡することができシングルトンをご紹介します。 、代わりにselectedRowsと相互作用し、今から

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

RowsManager.shared.selectedRowsを使用します。ここでは

はシングルトンクラスの簡単な実装です。

シングルトンを使用すると、すばやく簡単に解決できます。しかし、userdefaults,Core Datafile systemへの書き込みなど、iOSエコーシステムには多くの持続性テクニックがあります。

0

自分で選択状態を管理する方がよいでしょう。 reloadData(),reloadSections...,reloadRowsAtIndexPaths...が呼び出されると、UITableViewは選択状態をクリアします。

あなたのステーションでは、システムの動作です。ユーザが詳細ビューコントローラからポップバックすると、UIKitは自動的に選択解除されます。

これを再現するには、selectoin状態を保存し、必要なときに復元するだけです。

var selections = [NSIndexPath]() 
    ... 
    ... 
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if !selections.contain(indexPath) { 
     selections.append(indexPath) 
    } 
} 
関連する問題