[英][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.