我正在使用apple提供的方法(canEditRowAtIndexPath
和commitEditingStyle
)之外的函数来从tableView中删除单元格。这是我的代码:
func deleteItem() {
items.removeAtIndex(currentIndexPath!.row)
tableView.deleteRowsAtIndexPaths([currentIndexPath!], withRowAnimation: .Automatic)
}
它会执行删除行时通常会发生的所有事情。但是,当新行插入tableView时,它们会以这种方式将来自先前删除的单元格之一的数据分层到新的单元格之上:
可以轻松添加项目,
它们也可以轻松删除,
目前,我最好的猜测是它有删除细胞的问题。任何建议将不胜感激。
答案 0 :(得分:2)
目前,我最好的猜测是删除细胞存在问题。任何建议都将不胜感激。
如果您可以通过使用调试器或print语句确认是否正在调用您的删除方法,那么我会说您的单元格包含出列的陈旧数据,这将与您看到的铺设一致
检查逻辑中的“添加新项”功能。
检查您的数据源并确保其中包含正确的数据和项目数,您可以在自定义删除方法中进行检查。
在下面的UITableViewDatasourceDelegate方法中设置断点并检查单元格的属性或使用print语句进行调查。我建议使用cell.titleLabel!.text,因为这是你看到重复的数据。
tableView(_ tableView:UITableView, cellForRowAtIndexPath indexPath:NSIndexPath)
尝试使用UITableView的reloadData()
方法删除后立即重新加载数据。
请参阅UITableView参考文档。
讨论出于性能原因,表视图的数据源通常应该在分配单元格时重用UITableViewCell对象 到其tableView:cellForRowAtIndexPath:方法中的行。表格视图 维护数据的UITableViewCell对象的队列或列表 source标记为重用。从您的数据源调用此方法 当要求为表视图提供新单元格时对象。这个 如果现有单元格可用或创建新单元格,则该方法会将现有单元格取消 一个使用您先前注册的类或nib文件。如果没有细胞 是可以重用的,你没有注册一个类或nib文件, 这个方法返回nil。
如果您为指定的标识符和新单元格注册了一个类 必须创建,此方法通过调用它来初始化单元格 initWithStyle:reuseIdentifier:方法。对于基于笔尖的细胞,这个 方法从提供的nib文件加载单元格对象。如果 现有的单元可以重用,这种方法称为单元 而不是prepareForReuse方法。
答案 1 :(得分:-1)
我刚遇到这个问题。你不能只有
self.tableView.deleteRows(at: [indexPath], with: .fade)
您必须将其从数组中删除,如下所示:
myArray.remove(at: indexPath.row)