数据未在 UITableView 中加载。可能是啥问题?

Posted

技术标签:

【中文标题】数据未在 UITableView 中加载。可能是啥问题?【英文标题】:Data is not loading in UITableView. What could be the issue?数据未在 UITableView 中加载。可能是什么问题? 【发布时间】:2012-08-15 11:20:39 【问题描述】:

当按下按钮时,我在下一个 segue 中有一个 UITableView。我在实现文件中实现的代码如下。视图正在移动,但数据未加载到视图中。

可能是什么问题?

- (void)viewDidLoad

    [super viewDidLoad];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        NSData* data = [NSData dataWithContentsOfURL:
                        [NSURL URLWithString: @"https://api.twitter.com/1/statuses/public_timeline.json"]];
        NSError* error;
        tweets = [NSJSONSerialization JSONObjectWithData:data
                                                 options:kNilOptions
                                                   error:&error];
        dispatch_async(dispatch_get_main_queue(), ^
            [self.tableView reloadData];
        );
    );

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;


- (void)viewDidUnload

    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    return (interfaceOrientation == UIInterfaceOrientationPortrait);


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return 0;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return tweets.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"TweetCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    
    NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];
    NSString *text = [tweet objectForKey:@"text"];
    NSString *name = [[tweet objectForKey:@"user"] objectForKey:@"name"];
    cell.textLabel.text = text;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"by %@", name];
    return cell;

【问题讨论】:

你的tableView的delegatedataSource设置了吗? 您是否检查过您是否收到了正确的 JSON? NSLog(@"%@", [[[NSString alloc] initWithData: 数据编码: NSUTF8StringEncoding] autorelease]); 是的,delegate 和 dataSource 都设置为 tableview 在另一个示例项目中,相同的代码运行良好。所以我假设收到的 JSON 是正确的。 【参考方案1】:
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return 0;

您不需要至少 1 个部分吗?

【讨论】:

我以后可能需要。但目前,这只是为了测试目的。 @MonisManzoor Anthony 说的很对 - 零个部分是不够的,你确实需要一个。 谢谢,伙计们。这似乎有点工作。但是数据仍然没有加载到表格视图中。它现在在每个单元格中显示“by null”。【参考方案2】:

您应该在调试器中使用断点来中断numberOfRowsInSection 方法和cellForRowAtIndexPath 以验证您的数据是否被正确解析和处理。如果您不熟悉断点,现在是了解它们的好机会 - 它们在调试和解决问题方面非常宝贵

一般来说,您可能不应该使用dataWithContentsOfURL 来建立网络。它并不是真正为这种用途而设计的。 NSURLConnection 是一个更好的选择,它将为您提供更大的灵活性。

【讨论】:

【参考方案3】:
dyspatch_async

之所以命名为 as 是因为它是异步的。您似乎认为第二次调用它是在第一次调用之后执行的 - 但不是。它们是并行执行的,由于 URL 操作较慢,表格视图的更新发生在还没有数据时。

解决方案:将 reloadData 调用与 URL 操作放在同一个块中 - 您不需要两个单独的 dispatch_async 调用。

另外,你从

返回 0
numberOfSectionsInTableView:

因此该表甚至不查找数据。返回 1。

【讨论】:

那你为什么撤销+1?你发现我的回答有问题吗? 我没有撤销任何东西。从我的角度来看,这两个答案都很恰当。

以上是关于数据未在 UITableView 中加载。可能是啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中加载数据最快的方法是啥

iframe 未在 Jquery 中加载

Chrome 扩展程序未在 YouTube 的浏览器导航中加载

页面未在 chrome 中加载

本地数据未在 phonegap build + appframework 应用程序中加载

CollectionView 单元格未在视图控制器中加载