【问题标题】:UITableView not showing first time, only when scrolling a bitUITableView 第一次没有显示,只有在滚动一点时
【发布时间】:2013-12-14 21:02:58
【问题描述】:

我有一个 UITableViewController,它正在从 NSURLConnection 加载数据:

NSURL *url = [NSURL URLWithString:@"http://url.now"];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
    if ([data length] > 0 && error == nil){
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
        [parser setDelegate:self];
        [parser parse];
    }
    else if (error != nil){
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"No internet connection" message:@"Content." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:true];
    }
}];

解析结束时,调用reloaddata方法。但是当应用程序加载时,UITableView 的内容没有显示出来。当我滚动一点时,它会立即可见。重新加载没问题。

如何解决这个问题?

【问题讨论】:

  • 在viewDidLoad中,你调用[tableView reloadData];对吗?
  • 我正在调用 [tableView reloadData];在解析最后一个元素时在 parserDidEndElement 中。我在viewDidLoad中也试过了,但是没有效果!

标签: ios asynchronous uitableview


【解决方案1】:

解决了。将 tableView reloadData 更改为:

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

它就像一个魅力。感谢所有答案和 cmets。

【讨论】:

    【解决方案2】:

    可能发生的情况是,您的表格加载速度比您下载数据所需的时间要快。 将委托添加到管理您的数据并使您的表视图控制器符合该委托协议的类。 比,一旦数据被下载和解析重新加载表。

    【讨论】:

    • 我不这么认为,因为 OP 说“解析结束时,调用 reloaddata 方法。”
    • 操作?无论如何,放一些断点,看看首先发生了什么,如果你有数据第一次可重复使用的单元格双端队列。
    • @MichalShatz 确实先加载了表,但是加载的时候调用了tableView reloadData,但是什么也没发生。只有当视图滚动一点时,一切都会变得可见。
    • Reson 是当你调用 reloadData 时,数据还不可用。这就是为什么您的 dispatchingMainQueue 解决方案“像魅力一样工作”的原因 - 您在使用主队列而不是后台时重新加载数据,并在主队列上强制加载缓慢,这会导致糟糕的用户体验。
    • 实际上调用 mainQueue 是有效的,因为解析是在 NSURL 的后台 asyc 上执行的,并且根据苹果更新视图应该在 mainThread 中完成,这就是 mainQueue 进入它运行 tableview 重新加载主线程。
    【解决方案3】:

    取消选中“使用大小类”选项,然后返回并重新检查它可以解决此问题。

    • 在项目导航器中,选择情节提要或 xib 文件。
    • 文件的内容在 Interface Builder 中打开。
    • 选择视图 > 实用程序 > 显示文件检查器。
    • 在 Interface Builder Document 部分,取消选中“Use Size Classes”复选框。
    • 离开菜单。回来并再次勾选“使用尺寸类别”复选框。

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多