tableView beginUpdates / endUpdates 阻止重新加载整个表,即使是空的

Posted

技术标签:

【中文标题】tableView beginUpdates / endUpdates 阻止重新加载整个表,即使是空的【英文标题】:tableView beginUpdates / endUpdates block reloading entire table even when empty 【发布时间】:2015-02-25 03:17:36 【问题描述】:

我有一个 tableView,它会定期通过来自远程服务的数据进行更新。我加载数据,并存储我刚刚插入、删除或更新的各种数据的 indexPaths。然后我有一个 begin/endUpdates 块来完成必要的操作,如下所示。

    [self.tableView beginUpdates];
    if (pathsToDelete) 
        [self.tableView deleteRowsAtIndexPaths:pathsToDelete withRowAnimation:UITableViewRowAnimationNone];
    
    if (pathsToRefresh) 
        [self.tableView reloadRowsAtIndexPaths:pathsToRefresh withRowAnimation:UITableViewRowAnimationNone];
    
    [self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];

我最近注意到重新加载单元的次数超出了我的预期。在调试器中,我注意到在刷新单个记录的情况下(即,pathsToRefresh 是唯一有任何内容的记录,并且它只有一个索引),整个表实际上正在重新加载。我的意思是,我看到了对表中每个单元格的数据源请求。

在调试过程中,我开始剥离东西。我一直到只有我有的地步

        [self.tableView beginUpdates];
        [self.tableView endUpdates];

即便如此,我看到整个表重新加载(即 cellForRowAtIndexPath 为数据源中的每个值触发)。所以我认为发生了我错过的其他事情。但是删除这两种方法导致重新加载停止。

如果块内没有任何内容,begin/endUpdates 不应该什么都不做吗?我对这里实际发生的事情一无所知,因为文档表明他们所做的只是书挡表操作 - 在这种情况下我没有。

【问题讨论】:

那么,cellForRowAtIndexPath 正在为您的数据源中的每个项目调用? 【参考方案1】:

目标 c iOS reloadRowsAtIndexPaths , reloadSections

if([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1 == -1)

row = 0;

else

row = [self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1 ;



NSIndexPath* indexPath = [NSIndexPath indexPathForRow: (row) inSection: ([self.tableView numberOfSections]-1)];

// [self.tableView reloadData];

[self.tableView beginUpdates];

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

[self.tableView endUpdates];



NSLog(@”Number of Sections %ld”, (long)[self.tableView numberOfSections]);

NSLog(@”Number of Rows %ld”, [self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1);

【讨论】:

以上是关于tableView beginUpdates / endUpdates 阻止重新加载整个表,即使是空的的主要内容,如果未能解决你的问题,请参考以下文章

UITableView beginUpdates/endUpdates 回调

tableView beginUpdates / endUpdates 阻止重新加载整个表,即使是空的

beginUpdates和endUpdates 实现UITableView的动画块

在没有滚动或动画的情况下重新加载 tableview 部分

使用插入功能时奇怪的tableView动画

CAShapeLayer 动画问题