1

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

我在这个类似但较旧的线程中找到了一个函数。由于 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
        }
    }
}

通过打印出我可以看到的值,当下面的这个语句评估为真时,这是有道理的。但复选标记不会被切换。

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

谢谢!

4

2 回答 2

1

首先告诉您的表格视图一次只能选择一个单元格:

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
  }

然后你可以说附件类型应该是 .checkmark intableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)和 .none in 。tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)这是怎么做的,你应该很好,如果不让我知道,我可以再次编辑。

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
}
于 2017-01-07T00:50:02.163 回答
0

斯威夫特 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
}
于 2020-10-11T17:24:42.643 回答