从 UITableView 插入和删除行时如何正确更新数据源?

Posted

技术标签:

【中文标题】从 UITableView 插入和删除行时如何正确更新数据源?【英文标题】:how to properly update datasource when inserting and deleting rows from UITableView? 【发布时间】:2012-12-07 08:37:34 【问题描述】:

我正在尝试从 UITableView 中删除一些行,这是我的代码...

    [self.responsesTableView beginUpdates];
    [self.responsesTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:self.processingIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self. responsesTableView endUpdates];
    noOfRsponses --;
    if (self.segFrndEveryone.selectedSegmentIndex == 0) 
        [self.arrFriendComments removeObjectAtIndex:self.processingIndexPath.row];
    else 
        [self.arrAllComments removeObjectAtIndex:self.processingIndexPath.row];
    

其中两个数组之一是我的数据源,取决于所选的段。 我收到以下错误,不知道如何处理。

更新后现有节中包含的行数 (9) 必须等于该节中包含的行数 在更新 (9) 之前,加上或减去插入的行数或 从该部分删除(0 插入,1 删除)和加号或减号 移入或移出该部分的行数(0移入,0 搬出去了)。'

【问题讨论】:

【参考方案1】:

您应该在手动更改 UITableView 之前更新您的数据源。

// update the data source for the table change
noOfRsponses--;
NSMutableArray *targetArray = (self.segFrndEveryone.selectedSegmentIndex == 0) ? self.arrFriendComments : self.arrAllComments;
[targetArray removeObjectAtIndex:self.processingIndexPath.row];

// update the table view itself
[[self responsesTableView] beginUpdates];
[[self responsesTableView] deleteRowsAtIndexPaths:[NSArray arrayWithObject:self.processingIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[[self responsesTableView] endUpdates];

【讨论】:

我尝试了您的建议,但现在消息已更改为...无效更新:无效的部分数。更新后表视图中包含的节数(8)必须等于更新前表视图中包含的节数(9),加上或减去插入或删除的节数(0插入,0已删除)。' 错误消息报告您在更新 row 后的 sections 数量无效,这让我想知道这里是否存在第二个问题.无论如何,您要删除的行是该部分中唯一的行吗?【参考方案2】:

您是否在正确的数组上调用 removeObjectAtIndex?根据错误消息,您实际上并没有从数据源中删除 tableview 期望您从中删除的对象。我猜你可能是从错误的数组中删除。

还有一件事要尝试:先删除对象,然后执行 deleteRowsAtIndexPath。

【讨论】:

我尝试了您的建议,但现在消息已更改为...无效更新:无效的部分数。更新后表视图中包含的节数(8)必须等于更新前表视图中包含的节数(9),加上或减去插入或删除的节数(0插入,0已删除)。' 修复它...愚蠢的错误。 (也返回了没有部分的响应......:X)【参考方案3】:

你应该对部分使用方法

- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;

【讨论】:

以上是关于从 UITableView 插入和删除行时如何正确更新数据源?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UITableView 在插入或删除行时会“跳跃”?

当用户点击加号按钮插入行时 UITableView 响应

尝试从 UITableView 中删除行时断言失败

尝试从UITableView中删除行时有时崩溃

添加/删除 UITableView 行时如何防止文本字段变空?

选择 UITableView 中的行时如何清除文本字段?