首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:配件的麻烦

Swift:配件的麻烦
EN

Stack Overflow用户
提问于 2020-05-21 13:05:17
回答 1查看 56关注 0票数 0

在我的项目中,我只是添加了这一行代码,以便在用户选择的单元格旁边添加一个小小的复选标记。(在did中选择行在函数中)

代码语言:javascript
复制
    let currentCell = tblView.cellForRow(at: indexPath)! as UITableViewCell
    currentCell.accessoryType = .checkmark

currentCell打印得很好。例如,当我打印出单元格时,它会给我单元格的框架;文本;clipsToBounds;自动调整大小;layer:0>。但是,当我按预期添加这一行代码时,它确实在该单元格上添加了复选标记,但也添加了从该单元格开始的其他15个单元格--看起来如下所示

有人知道为什么会发生这种事吗?我怎么才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-21 13:19:27

这不是你使用表视图的方式。

表视图单元格被重用。复选标记出现在您没有点击的单元格上,因为它实际上与您所点击的单元格相同,但是由于该单元格已被滚动出视图,它将在底部重新显示,只是使用不同的标签文本。

didSelectRow中要做的正确事情是更新模型。现在,您可能正在使用一个事物数组作为表视图的数据源:

代码语言:javascript
复制
var listOfThings: [MyModel]!

现在,您只需要以某种方式存储选择了哪些东西,哪些不在您的模型中。例如在另一个数组中:

代码语言:javascript
复制
var thingsSelectionStatuses: [Bool]!

初始化如下:

代码语言:javascript
复制
thingsSelectionStatuses = Array(repeating: false, count: listOfThings.count)

didSelectRow中,更新thingsSelectionStatuses并重新加载单元格。

代码语言:javascript
复制
thingsSelectionStatuses[indexPath.row].toggle()
tableView.reloadRows(at: [indexPath], with: .automatic)

重新加载单元将导致调用cellForRowAt。在cellForRowAt中,我们根据thingsSelectionStatuses设置accessoryType

代码语言:javascript
复制
cell.accessoryType = thingsSelectionStatuses[indexPath.row] ? .checkmark : .none
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61935191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档