[tableView reloadData];在我滚动tableView之前不起作用

时间:2011-02-11 11:24:03

标签: ios uitableview reloaddata

我有一个简单的应用,可以在用户输入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单元格样式,并且我不会改变高度或使用表格视图看中任何东西。

我做错了什么?

5 个答案:

答案 0 :(得分:65)

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

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

我认为这比performSelectorOnMainThread选项更实用

答案 1 :(得分:34)

致电

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

而不是

[self.tableview reloadData]

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:0)

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

最后我发现我在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];
}

然后一切正常。

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

答案 4 :(得分:0)

重新加载 tableView

中的viewWillLayoutSubviews