2017-05-25 33 views
1

我在猜测我们应该倾向于使用不可变数组作为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是不可变的。

现在我有两个问题......国际海事组织(纠正我,如果我错了),在上面的方法从两个方面从数组中删除对象具有相同的效果。消息数组最后删除了一个元素。就是这样......但是像后一个例子那样做,可以让我拥有不可变的数据模型数组。

有人可以评论什么实际上是一个首选的方式(或我可以说正确的方式?)以更新数据模型数组后删除?

回答

1

我宁愿有一个可变数组,但将其设为私有。然后,如果其他课程需要更改数组,您可以提供一个add()方法和一个delete()方法。这两者都有责任更新数组和表视图。

+0

它实际上已经是私人了......我更担心在哪些情况下可能会发生一些混乱,如果我保持它可变...... – Whirlwind

+2

如果更改数组,无论可变性如何,表视图必须用它来更新,否则你会看到不好的数据并可能崩溃(例如,当你滚动到结尾时索引超出界限的错误) – beyerss

1

从表视图的角度来看,数据源用于组织数据的结构并不重要。表视图不直接访问该结构。它要求数据源提供它需要的部分。

现在,你是对的:你可以通过改变支持数据搞乱你的表格视图。但是,无论特定集合的可变性如何,都会发生这种情况。你的不可变数组片段做同样的事情:表格视图不知道任何东西的变化,直到你通知它与deleteRowsAtIndexPaths:animated。当数据源更新时重新加载表视图是必需的,无论您的数据源在内部执行什么操作。

+0

好吧,我现在得到你们所说的。不过,我认为在上面的例子中不需要'reloadData',因为'deleteRowsAtIndexPaths'会自动更新tableview,对吧?我的意思是,我改变数据模型数组,然后我调用deleteRowsAtIndexPaths,并且tableview会自动更新而不需要发送reloadData? – Whirlwind

+0

是的,对不起,你完全正确。我没有像我应该那样彻底地阅读你的代码。 –

0

斯威夫特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照顾它。你只需要更新你的数据源