用新数据重新加载uitableview导致闪烁
我添加了无限的滚动function,并意识到,每当我重新加载的uitableview,视图闪烁..我不知道如何解决闪烁在这一点上。 请帮忙,谢谢!
我看到一个非常类似的问题,但没有解决scheme。 我尝试了作者发布的一个,但它不工作:“从父视图中删除tableview,重新加载数据,把表视图放回父视图”( UITableView reloadData – 如何停止闪烁 )
代码:[self.tableView reloadData];
正如你所猜测的,闪烁是由调用[self.tableView reloadData]引起的。 快速和反复,特别是在iOS 5.x设备上。 但是您可能不想重新加载整个表格,只想更新表格可见单元格内的视图。
假设您要更新表格的每个单元格以反映文件正在下载的最新下载%。 一个方法[下载:totalRead:totalExpected:]在我的例子中被调用,非常迅速,当字节正在下载。
这是什么不做…重载每一个小的更新表(在这个例子中,开发人员可能依靠“cellForRowAtIndexPath”或“willDisplayCell”方法执行更新所有可见的单元格):
- (void)downloading:(PPFile *)file totalRead:(long long)read totalExpected:(long long)expected { // Bad! Causes flickering when rapidly executed: [self.tableView reloadData]; }
以下是更好的解决scheme。 当单元格的视图需要更新时,通过从表格中只抓取可见单元格来find该单元格,然后直接更新该单元格的视图而不重新加载表格:
- (void)downloading:(PPFile *)file totalRead:(long long)read totalExpected:(long long)expected { NSArray *cells = [self.tableView visibleCells]; for(MYCellView *cell in cells) { if(cell.fileReference == file) { // Update your cell's view here. } } }
下面的代码为我工作就像一个魅力!
[UIView performWithoutAnimation:^{ [self.tableview reloadData]; [self.tableview beginUpdates]; [self.tableview endUpdates]; }];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:index] withRowAnimation:UITableViewRowAnimationNone];
无论何时删除或添加更新中的表格行,表格视图都会重新加载并根据要animation的单元格的位置来询问数据源的行数。
你是从表中删除行,但不是从数据源..所以行被删除,但你的数据源仍然指出没有行被删除..20对象仍然存在。 你的数据源将会是这样的
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return MyDataModel.count; // }
所以你需要删除或添加数据源中的新数据也是这样的
NSIndexPath *index = [NSIndexPath indexPathForRow:i inSection:0]; [MyDataModel removeObjectAtIndex:index.row]; [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:index] withRowAnimation:UITableViewRowAnimationNone];
为什么不直接调用reloadSections方法而不是[self.tableView reloadData];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
你正在使用deleteRowsAtIndex? 如果重新加载表,则调用所有表委托方法。 我认为需要时间来删除所有的行,然后重新加载。 只需使用重载方法并尝试。
引用你的cellForRowAtIndexPath
委托方法。 您可能正在做一些可能会导致轻弹的操作。 就我而言,我是用animation设置图像视图的图像。 所以,每当我重新加载表,由于该animation闪烁。
我删除它,为我工作..
以防万一所有其他答案不能解决您的问题,我张贴我的解决scheme。
如果使用estimatedHeaderHeight或estimatedRowHeight
估计高度或者-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
,并且每个section都有dynamic行数 (例如可展开的两级tableView)
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
返回正确的高度。
我的项目中有什么工作是:
UIView.PerformWithoutAnimation(() => { tableView.ReloadData(); tableView.LayoutIfNeeded(); });
(这是在C#xamarin …但速度相同的目标C)