; 直到我滚动tableView不工作

我有一个简单的应用程序,当用户键入一个UISearchBar时,用XML下载search结果。 下载+parsing是线程化的,一旦完成,它触发一个NSNotification来告诉ViewController的table view到[tableView reloadData];

下面是接收结果发出后通知的代码:

 - (void)receivedResults:(id)notification { results = [notification object]; DLog(@"Received %i results",[results count]); [[self tableView] reloadData]; } 

我得到日志输出“接收4结果”,但表格视图不重新加载数据,直到我滚动/拖动它几个像素。 我正在使用内置的UITableViewCellStyleSubtitle单元格风格,即时通讯不会改变高度或任何东西喜欢与表视图。

我究竟做错了什么?

我能够得到同样的工作。 但问题是重载数据需要在主线程上调用。

 dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); 

我认为这比performSelectorOnMainThread选项更实用

呼叫

 [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

代替

 [self.tableview reloadData] 

我的问题是,我从后台线程发布NSNotification。 为了避免这种情况,只需将您的postNotificationMethod包装在dispatch_async方法中,如下所示:

 dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:@"FinishedDownloading" object:result]; }); 

当收到这个通知时, tableView.reloadData将在主线程上被调用。

我有同样的问题,我已经尝试了所有的解决scheme,我可以find谷歌。 但他们都不工作。

最后我发现我在viewDidLoad之前添加观察者,然后[self.tableView reloadData]不起作用。

首先,我在根导航视图控制器的viewDidLoad中调用setObserverForUserInfoDatabase。 因为我觉得这是早些时候被调用的。 function是这样的:

 - (void)setObserverForUserInfoDatabase:(NSString *)name { [[NSNotificationCenter defaultCenter] addObserverForName:name object:nil queue:nil usingBlock:^(NSNotification *note) { [self loadUserInfo]; [self.tableView reloadData]; NSLog(@"User Panel Notification \n %@", self); }];} 

然后我将代码移到viewController本身的viewDidLoad中。

 - (void)viewDidLoad { NSLog(@"View Did Load"); [super viewDidLoad]; [self setObserverForUserInfoDatabase:UserInfoDataBaseAvailabilityNotification]; } 

然后一切正常。

我还不知道原因。 如果有人知道,请告诉我。

viewWillLayoutSubviews 重新加载你的tableView