[英][tableView reloadData]; doesn't work until I scroll the tableView
我有一個簡單的應用程序,當用戶鍵入UISearchBar
時,它會以XML格式下載搜索結果。 下載+解析是線程化的,一旦完成它就會激活一個NSNotification
來告訴ViewController表視圖為[tableView reloadData];
以下是在結果出現時接收通知的代碼:
- (void)receivedResults:(id)notification {
results = [notification object];
DLog(@"Received %i results",[results count]);
[[self tableView] reloadData];
}
我得到日志輸出“Received 4 results”,但表格視圖不會重新加載數據,直到我滾動/拖動幾個像素。 我正在使用內置的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
。
我有同樣的問題,我已經嘗試了我可以在谷歌上找到的所有解決方案。 但所有這些都不起作用。
最后我發現我在viewDidLoad之前添加了觀察者,然后[self.tableView reloadData]無效。
首先,我在根導航視圖控制器的viewDidLoad中調用setObserverForUserInfoDatabase。 因為我認為它早先被稱為。 功能是這樣的:
- (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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.