猿问

UITableView完成查询数据后会收到通知吗?

有什么方法可以找出何时UITableView从其数据源中查询数据?

的无viewDidLoadviewWillAppearviewDidAppear关联的视图控制器(方法UITableViewController)是使用在这里,因为他们都火得太早。它们中的一个(完全可以理解)不能保证对数据源的查询暂时已经完成(例如,直到视图滚动为止)。

一个解决办法,我发现是调用reloadDataviewDidAppear,因为当reloadData返回时,表视图保证完成查询数据源,它更需要的时间存在。

但是,这似乎有点令人讨厌,因为我认为这会导致在reloadData首次加载数据源时两次(自动一次,由于调用而一次)要求输入相同的信息。

我要这样做的原因是我想保留-的滚动位置,UITableView但要一直到像素级别,而不仅仅是到最近的行。

当恢复滚动位置(使用scrollRectToVisible:animated:),我需要的表视图已经有足够的数据在里面,否则scrollRectToVisible:animated:方法调用什么也不做(这是如果你把它自己的呼叫任何会发生什么viewDidLoadviewWillAppearviewDidAppear)。


梵蒂冈之花
浏览 663回答 3
3回答

狐的传说

由于自编写答案以来对UITableView实现进行了一些更改,因此该答案似乎不再有效。看到这个评论:UITableView完成请求数据时得到通知?我一直在玩这个问题困扰了几天,觉得子类UITableView的reloadData是最好的方法:- (void)reloadData {    NSLog(@"BEGIN reloadData");    [super reloadData];    NSLog(@"END reloadData");}reloadData在表重新加载其数据之前不会结束。因此,当第二个NSLog被触发时,表视图实际上已经完成了对数据的查询。我已经细分UITableView为在之前和之后将方法发送给委托reloadData。它像一种魅力。

ibeautiful

这个答案实际上不是解决方案。起初它似乎起作用了,因为重新加载可能很快发生,但是实际上,在数据完全完成重新加载之后,不一定会调用完成块-因为reloadData不会阻止。您可能应该寻找更好的解决方案。为了扩展@Eric MORAND的答案,让我们输入一个完成代码块。谁不喜欢一个代码块?@interface DUTableView : UITableView   - (void) reloadDataWithCompletion:( void (^) (void) )completionBlock;@end和...#import "DUTableView.h"@implementation DUTableView- (void) reloadDataWithCompletion:( void (^) (void) )completionBlock {    [super reloadData];    if(completionBlock) {        completionBlock();    }}@end用法:[self.tableView reloadDataWithCompletion:^{                                            //do your stuff here                                        }];
随时随地看视频慕课网APP

相关分类

iOS
我要回答