我猜我们应该倾向于为UITableView
使用的数据模型数组使用不可变数组。关于这一点的读物在互联网上是非常不同的。我会说这可以防止在tableview显示数据时修改数组。例如,如果上述情况发生,numberOfRowsInSection:
方法可能会出现问题(对我来说,即使我知道它在理论上是可行的,我仍然无法想象现实世界中这种情况会如何发生)?
现在,在commitEditingStyle:forRowAtIndexPath:
方法中,我这样做(messagesArray是可变的):
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
Message *message = messageArray[indexPath.row];
[messagesArray removeObject:message];
[self.messageTable deleteRowsAtIndexPaths:[NSArray arrayWithObject: indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
而不是(messagesArray
不可变):
NSMutableArray *temp = [NSMutableArray arrayWithArray:messagesArray];
[temp removeObject:message];
messagesArray = [NSArray arrayWithArray:temp];
如果messageArray
是不可变的,那么后面的代码就是我必须要做的。
现在我有两个问题...... IMO(如果我错了,请纠正我),在上述方法中以两种方式从数组中删除对象具有相同的效果。 messagesArray最终删除了一个元素。就是这样......但是在后一个例子中做的事情允许我拥有不可变的数据模型数组。
在删除单元格后,有人可以评论实际上首选的方式(或者我可以说是正确的方法吗?)来更新数据模型数组?
答案 0 :(得分:1)
我更喜欢拥有一个可变数组但是将其设为私有。然后,如果另一个类需要更改数组,则可以提供add()
方法和delete()
方法。两者都有责任更新数组和表视图。
答案 1 :(得分:1)
从表视图的角度来看,您的数据源用于组织数据的结构并不重要。表视图不直接访问该结构。它会在需要时向数据源询问所需的部分。
现在,你是对的:你可以通过更改支持数据来搞砸你的表格视图。但无论特定集合的可变性如何,都会发生这种情况。您的不可变数组代码段执行相同的操作:在您使用deleteRowsAtIndexPaths:animated
通知之前,表格视图不知道任何内容已更改。无论您的数据源在内部执行什么操作,在数据源更新必需时重新加载表格视图。
答案 2 :(得分:0)
Swift 3版本:
func tableView(_ tableView: UITableView, commit editingStyle:
UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
//1. remove data from model
dataSource.remove(at: indexPath.row)
//2. remove row from view
tableView.deleteRows(at: [indexPath as IndexPath], with: .fade)
}
}
是的!实现滑动删除时不需要重新加载数据! UITableView
负责照顾它。您只需要更新dataSource