更新UITableView使用的数据模型阵列的正确方法
我在猜测我们应该倾向于使用不可变数组作为UITableView
使用的数据模型阵列。关于这一点的读物在互联网上是非常不同的。我会说,这可以防止在tableview显示数据时修改数组。例如,如果发生上述情况,numberOfRowsInSection:
方法可能会产生问题,对(即使我知道它在理论上是可行的,我仍然无法真正想到情况如何在真实世界中发生这种情况)?更新UITableView使用的数据模型阵列的正确方法
现在,在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
是不可变的。
现在我有两个问题......国际海事组织(纠正我,如果我错了),在上面的方法从两个方面从数组中删除对象具有相同的效果。消息数组最后删除了一个元素。就是这样......但是像后一个例子那样做,可以让我拥有不可变的数据模型数组。
有人可以评论什么实际上是一个首选的方式(或我可以说正确的方式?)以更新数据模型数组后删除?
我宁愿有一个可变数组,但将其设为私有。然后,如果其他课程需要更改数组,您可以提供一个add()
方法和一个delete()
方法。这两者都有责任更新数组和表视图。
从表视图的角度来看,数据源用于组织数据的结构并不重要。表视图不直接访问该结构。它要求数据源提供它需要的部分。
现在,你是对的:你可以通过改变支持数据搞乱你的表格视图。但是,无论特定集合的可变性如何,都会发生这种情况。你的不可变数组片段做同样的事情:表格视图不知道任何东西的变化,直到你通知它与deleteRowsAtIndexPaths:animated
。当数据源更新时重新加载表视图是必需的,无论您的数据源在内部执行什么操作。
好吧,我现在得到你们所说的。不过,我认为在上面的例子中不需要'reloadData',因为'deleteRowsAtIndexPaths'会自动更新tableview,对吧?我的意思是,我改变数据模型数组,然后我调用deleteRowsAtIndexPaths,并且tableview会自动更新而不需要发送reloadData? – Whirlwind
是的,对不起,你完全正确。我没有像我应该那样彻底地阅读你的代码。 –
斯威夫特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
照顾它。你只需要更新你的数据源
它实际上已经是私人了......我更担心在哪些情况下可能会发生一些混乱,如果我保持它可变...... – Whirlwind
如果更改数组,无论可变性如何,表视图必须用它来更新,否则你会看到不好的数据并可能崩溃(例如,当你滚动到结尾时索引超出界限的错误) – beyerss