Swift:仅为最后选择的单元格切换选项标记为ON - 不起作用

时间:2017-01-07 00:13:59

标签: swift toggle checkmark

我在一个部分中有一定数量的单元格。我的目标是只让最后选择的单元格显示复选标记。其他细胞不应该。

我在this中发现了一个类似但较旧的线程中的函数。由于Swift 3.0的变化,我已经对它进行了修改(我打赌这里存在问题)。

如下所示,对我来说,该功能无法正常工作。只有该部分中的最后一个单元格(不是最后选择,但最后一部分)才能获得复选标记。但我无法弄清楚为什么不。

这是完整的功能:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let section = indexPath.section
    let numberOfRows = tableView.numberOfRows(inSection: section)
    for row in 0..<numberOfRows {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.accessoryType = row == indexPath.row ? .checkmark : .none
        }
    }
}

通过打印输出值,我可以在下面的这个语句评估为true时看到,这是有意义的。但勾选标记不会被切换。

    cell.accessoryType = row == indexPath.row ? .checkmark : .none

谢谢!

2 个答案:

答案 0 :(得分:1)

首先告诉你的tableview它一次只能选择一个单元格:

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.allowsMultipleSelection = false
}

然后,让我们分析您的代码,您将获得正在选择当前单元格的部分,并计算该特定部分中的行数。你迭代该部分的行并检查你是否在给定的indexPath上有一个单元格(我猜它总是计算为true,因为你在该indexPath上总是有一个单元格,你没有根据你的值设置一个条件for循环)。然后,如果for循环中的行等于用户当前选择的单元格行,则告诉单元格具有复选标记。 在编写函数时,没有理由只能在该部分中的最后一个获得复选标记,但是你的问题过于复杂。

您的单元格是按照以下方法绘制的,因此最初应该使用附件。

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

    cell.textLabel?.text = "your text"

    cell.accessoryType = cell.isSelected ? .checkmark : .none
    // cell.selectionStyle = .none if you want to avoid the cell being highlighted on selection then uncomment

    return cell
  }

然后你可以说配件类型应该是tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)中的.checkmark和tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)中的.none。这是如何做的,你应该好,如果没有让我知道,我可以再次编辑。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .checkmark
}

override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .none
}

答案 1 :(得分:0)

Swift 4.x
Xcode 12

func viewDidLoad() {
 tableView.allowsMultipleSelection = false
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tvAmbientSoundTableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    tvAmbientSoundTableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}