我查看了几个与此相关的StackOverflow问题,但似乎还没有很好地理解这个概念。
我有一个带有几个单元格的tableview,我使用枚举填充。当我向下滚动行时,表中的另一行会被选中。我实现了以下方法:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("activityCell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = activities[indexPath.item].rawValue;
return cell;
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var cell = tableView.cellForRowAtIndexPath(indexPath);
cell?.selected = true;
}
我知道细胞是可重复使用的,但我无法正确理解这个概念以及它是如何应用的。
你能给我一些帮助吗?
干杯
答案 0 :(得分:1)
如果您要重复使用单元格,请按照您已完成的方式将单元格设置为selected
中的didSelectRowAtIndexPath
,这将使重用的单元格也反映出已更改的{{1}属性。相反,我建议为您的活动对象添加一个布尔selected
属性,以便可以在selected
中进行选择更改,例如:
cellForRowAtIndexPath:
答案 1 :(得分:0)
正如拜伦建议的那样,我们可以通过保存选中来处理这种情况 数组中的索引路径,并在未选中时从数组中删除它们。
var indexArray : [NSIndexPath]?
在将表加载为
之前初始化indexArray
self.indexArray = []
细胞选择&取消选择必须在委托函数的帮助下反映在indexArray中:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath as IndexPath) {
cell.accessoryType = .checkmark
self.indexArray?.append(indexPath as NSIndexPath)
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath as IndexPath) {
cell.accessoryType = .none
if let pos = self.indexArray?.index(of: indexPath as NSIndexPath)
{
self.indexArray?.remove(at: pos)
}
}
}
现在,当为每一行调用 cellForRowAtIndexpath 函数时,检查当前indexPath是否存在于indexArray中。如果是,则已经选择了该单元,否则,该单元处于未选择状态&在单元格上执行相应的任务。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourTableViewCell
if (self.indexArray?.contains(indexPath as NSIndexPath))!
{
cell.accessoryType = .checkmark
}
else
{
cell.accessoryType = .none
}
return cell
}