【问题标题】:[tableView reloadData]; doesn't work until I scroll the tableView[tableView 重载数据];在我滚动 tableView 之前不起作用
【发布时间】:2011-06-25 12:02:50
【问题描述】:

我有一个简单的应用程序,当用户输入UISearchBar 时,它会以 XML 格式下载搜索结果。下载+解析是线程化的,一旦完成,它就会触发NSNotification 告诉带有表格视图的 ViewController 到[tableView reloadData];

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

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

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

我做错了什么?

【问题讨论】:

  • results当然是一个实例变量,也是table view的来源,否则上面的代码即使在搜索后拉动table view也不会起作用。
  • 你确定 [self tableView] 不返回 nil 吗?可能是重新加载没有响应的原因,但 cellForRowAtIndexPath 会。该方法由委托调用。

标签: ios uitableview reloaddata


【解决方案1】:

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

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

我认为这比 performSelectorOnMainThread 选项更实用

【讨论】:

  • 不知道它是否更实用,但苹果确实推荐 GCD 支持 performSelector... 模式。
  • @MaciejSwic 这应该是这个特定问题的正确解决方案。问题是 OP 试图在后台线程上更改 UI,很可能他忘记退出了。您不应该将 performSelectorOnMainThread 作为一种解决方法来调用。
  • 这并没有为我解决。我的问题非常相似,但是单元格仅在完全滚动出视图并返回视图时才显示其内容。到目前为止,我对此完全感到困惑...... :-(
  • @ErikvanderNeut 嗨,你解决了这个问题吗?我也面临同样的问题
  • 嗨@Manimaran - 我从来没有找到解决潜在问题的正确方法,但是通过破解我能够让它看起来好像没有问题。一旦这看起来足够强大,我就离开了。我的技巧是在显示视图之前来回滚动表格。我现在对细节的记忆有点模糊,但基本上我只是在代码中实现了即时来回滚动,以确保单元格在实际显示在屏幕上之前已完全滚动出视图并返回视图。这听起来很荒谬,但那个丑陋的黑客确实解决了这个问题:-/ 很奇怪......
【解决方案2】:

打电话

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

而不是

[self.tableview reloadData]

【讨论】:

  • 很好,我正在为 NSNotification 的事件处理程序重新加载我的数据。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    然后一切正常。

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

    【讨论】:

    • setObserverForUserInfoDatabase 是做什么的,之前在哪里?
    • 该函数只是添加观察者。我把它放在了RootViewController的ViewDidLoad中。而且它不起作用。
    【解决方案5】:

    重新加载你的tableViewviewWillLayoutSubviews

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多