使用以下代码,当我单击一个单元格以创建复选标记附件时,它会每12行重复一次复选标记。关于为什么的任何想法?
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as? UITableViewCell
cell?.textLabel = "\(indexPath.row)"
return cell!
}
func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
if let cell = tableView.cellForRowAtIndexPath(indexPath) as? UITableViewCell {
if cell.accessoryType == UITableViewCellAccessoryType.Checkmark
{
cell.accessoryType = UITableViewCellAccessoryType.None
}
else
{
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
}
}
return indexPath
}
答案 0 :(得分:8)
由于Cell对象被重用,您不能依赖它们来存储数据或状态。它们只是您对数据模型中的数据的查看。您需要在cellForRowAtIndexPath
记录单元格选择状态的一种方法是使用Set
来存储所选的indexPaths
。这是一个显示这种技术的简单例子 -
class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {
var checkedRows=Set<NSIndexPath>()
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100 // Simple example - 100 fixed rows
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell=tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as!UITableViewCell
cell.textLabel!.text="Row \(indexPath.row)"
cell.accessoryType=self.accessoryForIndexPath(indexPath)
return cell
}
func accessoryForIndexPath(indexPath: NSIndexPath) -> UITableViewCellAccessoryType {
var accessory = UITableViewCellAccessoryType.None
if self.checkedRows.contains(indexPath) {
accessory=UITableViewCellAccessoryType.Checkmark
}
return accessory
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
if checkedRows.contains(indexPath) {
self.checkedRows.remove(indexPath)
} else {
self.checkedRows.insert(indexPath)
}
if let cell=tableView.cellForRowAtIndexPath(indexPath) {
cell.accessoryType=self.accessoryForIndexPath(indexPath)
}
}
}