具有单选和多选的uitableview

时间:2018-11-30 22:32:04

标签: ios swift uitableview

我有一个包含三个部分的表格视图。

第0,1节:在该节中选择一行。选定的行会出现一个选中标记。如果选择了新行,请取消选择并取消选中旧选择。

第2部分:按此部分中的一项进行自动搜索。


问题在于,当我在第2节中按一行时,出现一个选中标记,然后它出现了。我完全不希望选中标记出现,但我很难找到一种方法来消除它。

我在self.tableView.allowsMultipleSelection = true中设置了viewDidLoad,因此我可以在每个部分中选择一行,这对于前两个部分非常有用。

然后在cellForRowAt中为第2节(第三节)设置cell.accessoryType = .none,以便在该节中选择行时不会打勾。

似乎没有任何作用。


override func viewDidLoad() {
    self.tableView.allowsMultipleSelection = true
}

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let section = indexPath.section
    switch section {
    case 0,1:
        if let selected = tableView.indexPathsForSelectedRows {
            for selectedIndexPath in selected {
                if selectedIndexPath.section == indexPath.section {
                    tableView.deselectRow(at: selectedIndexPath, animated: false)
                }
            }
        }
        return indexPath
    case 2:
        return indexPath
    default:
        return nil
    }
}



override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "FilterTableViewCell", for: indexPath) as! FilterTableViewCell
    let section = indexPath.section
    switch section {
    case 0:
        cell.theLabel.text = myDataStuff[indexPath.row]
    case 1:
        cell.theLabel.text = otherDataStuff[indexPath.row]
    case 2:
        cell.theLabel.text = lastDataStuff[indexPath.row]
        cell.accessoryType = .none
    default:
        break
    }
    return cell
}

1 个答案:

答案 0 :(得分:1)

您的课程 FilterTableViewCell 中可能有类似的内容(也许下次共享更多代码):

override func setSelected(_ selected: Bool, animated: Bool) {
    if selected {
        self.accessoryType = .checkmark
    }
    else {
        self.accessoryType = .none
    }
}

因此,即使您在第3部分中的行具有 accessoryType = .none ,当您选择它们​​时,该属性也会再次修改。

快速的解决方案是使用这些功能来处理复选标记,而不是setSelected:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {

}