更新UITableView使用的数据模型数组的正确方法

时间:2017-05-25 11:36:14

标签: ios objective-c arrays uitableview nsmutablearray

我猜我们应该倾向于为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最终删除了一个元素。就是这样......但是在后一个例子中做的事情允许我拥有不可变的数据模型数组。

在删除单元格后,有人可以评论实际上首选的方式(或者我可以说是正确的方法吗?)来更新数据模型数组?

3 个答案:

答案 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