21

我有一个简单的应用程序,当用户输入UISearchBar. 下载+解析是线程化的,一旦完成,它就会触发一个NSNotification告诉 ViewController 与表视图[tableView reloadData];

这是收到结果后触发的通知的代码:

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

我得到日志输出“收到 4 个结果”,但表格视图不会重新加载数据,直到我滚动/拖动它几个像素。我正在使用内置的UITableViewCellStyleSubtitle单元格样式,并且我没有改变高度或对表格视图进行任何花哨的操作。

我究竟做错了什么?

4

5 回答 5

66

我能够让同样的事情发挥作用。但问题是需要在主线程上调用重新加载数据。

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

我认为这比 performSelectorOnMainThread 选项更实用

于 2012-08-15T22:03:39.230 回答
34

称呼

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

代替

[self.tableview reloadData]
于 2011-03-24T13:50:38.627 回答
4

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

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

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

于 2014-08-30T13:25:19.273 回答
0

我有同样的问题,我已经尝试了我在谷歌上找到的所有解决方案。但所有这些都不起作用。

最后发现我在viewDidLoad之前加了observer,然后[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];
}

然后一切正常。

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

于 2014-12-13T03:21:14.557 回答
0

重新加载tableViewviewWillLayoutSubviews

于 2017-04-19T05:14:19.313 回答