设置 UITableViewCell 的选定状态

Set selected state for UITableViewCell

提问人:Alex171 提问时间:11/12/2023 更新时间:11/13/2023 访问量:50

问:

我正在开发我的应用程序,当单击 1 个单元格时,它的背景应变为蓝色,如果单击其他单元格,则前一个单元格将重置其背景颜色。 这是我的setSelected func

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        if selected {
            borderView.applyBorder(color: .darkGray, width: 1)
            borderView.backgroundColor = .blue
        } else {
            borderView.applyBorder(color: .lightGray, width: 1.0)
            borderView.backgroundColor = .white
        }
    }

但是当我测试它时,单元格将具有蓝色背景,如果我单击其他单元格,它们不会重置。enter image description here

Swift UITableView

评论

0赞 DonMag 11/12/2023
你发布的代码没有错......问题出在您的代码中的某个地方,您没有向我们展示。

答:

0赞 matt 11/12/2023 #1

扔掉现有的代码。你不能以基于单元格的方式做到这一点;您必须以基于的方式执行此操作,这意味着您必须通过表内容所依赖的数据模型来实现它。

  1. 在表视图的委托中,实现表视图委托方法。在该方法中,更改表视图模型中的某些内容,以便每一行都知道它现在是否被选中,并调用表视图,以便它生成新的单元格。tableView(_:didSelectRowAt:)reloadData

  2. 在表视图的数据源中,根据该行的模型中的信息,配置您提供的所请求单元格的外观。tableView(_:cellForRowAt:)

评论

0赞 matt 11/12/2023
有关工作示例,请参阅 github.com/mattneub/Programming-iOS-Book-Examples/tree/master/...上的可下载项目,并查看我如何使点击单元格与具有复选标记的单元格相对应。这与您希望使点击单元格对应于哪个单元格是蓝色的愿望完全平行。
-1赞 son 11/12/2023 #2

在此方案中,它是一个选择表。我没有看到您用于设置表视图的代码,所以我想您使用的是不正确的属性。

//This property is false by default
tableView.allowsMultipleSelection = false

然后它应该正常工作。并获取所选行以用于其他目的。

//There is a property to get all selected rows. However, it's single selection table, so using this
if let selectedIndexPath = tableView.indexPathForSelectedRow {
    //TODO
}

但这种方法有一个缺点。当您要默认选择单元格时,即 .而不是像@matt在他的回答中所说的那样,将模型中的属性设置为 true。您必须按方法设置 。这意味着您让表视图处理选择状态,而您的模型仅用于显示信息。viewDidLoadselectedtableView.selectRow

enter image description here

评论

0赞 Alex171 11/12/2023
谢谢@son,我通过在我的 didSelectRowAt 中删除 table.deSelect 来让它工作
0赞 son 11/12/2023
在这种情况下,让表视图完成其工作,您不需要处理 2 个委托方法:select 和 deselect。