如何在tableview中选择和保存多个选择

时间:2017-07-27 09:37:01

标签: ios uitableview swift3

在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

            }
        }
    }
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您最好自己管理选择状态。在调用reloadData()reloadSections...reloadRowsAtIndexPaths...时,UITableView将清除选择状态。

对于您的电台,它的系统行为。当用户从详细视图控制器弹回时,UIKit将自动取消选择。

要重新获得它,只需存储selectoin状态,并在需要时恢复它。

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