0

我正在与以前工作的 UITableView 作斗争,但不知何故我把它弄坏了!它是 Paul Hegarty 课程单元的一部分

症状是视图加载但它是空的。我显然误解了一些相当基本的东西。

据我了解,两个关键方法是 1 节行数,在我的情况下返回零,我知道这是错误的!

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


 {


 //   #warning Incomplete method implementation.
    // Return the number of rows in the section.
    NSLog(@"TopPlaces %@",self.topPlaces);
    //return 100;
    return [self.topPlaces count];

   }

由于上述原因,永远不会调用以下方法,因为没有行。

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

第二个是在 ViewDidLoad 中,我可以将数据记录到控制台,一切看起来都很好。即我的数据是在 ViewDidLoad 中生成的

- (void)viewDidLoad


 {
        [super viewDidLoad];

    dispatch_queue_t    dowloadQueue = dispatch_queue_create("flick downloader", NULL);
    dispatch_async(dowloadQueue, ^{
        NSArray *topPlaces = [FlickrFetcher topPlaces];
        //NSLog(@"Array is %@",topPlaces); // array is OK here
        dispatch_async(dispatch_get_main_queue(), ^{
            NSSortDescriptor *woeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"_content" ascending:YES];  
            NSArray *woeDescriptors = @[woeDescriptor];
            NSArray *sortedReturns = [topPlaces sortedArrayUsingDescriptors:woeDescriptors];
            self.topPlaces = sortedReturns;
            //all the data is present here, count is 100 and array will log to console
           NSLog(@"count here is %u",[self.topPlaces count]);
        });
    });

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

}
4

2 回答 2

3

问题是您进行了异步调用以获取数据(这意味着您的数组应该在将来的某个时间点充满数据),但之后您不会重新加载您的表格视图。调用reloadData会解决问题:

 ...            
self.topPlaces = sortedReturns;
//all the data is present here, count is 100 and array will log to console
NSLog(@"count here is %u",[self.topPlaces count]);

[self.tableView reloadData]; // Assuming that 'tableView' is your outlet

这将指示您的 tableview 再次查询其数据源,并最终将所有数据加载到您的(现在非空的)topPlaces数组中。


进一步说明:

我在@nerak99 的评论中看到他不完全确定为什么用reloadData. 好吧,让我们举个例子:

想象一下,你有一家餐馆。

你在早上 06:00 打开这个地方,你发现你没有什么可做饭的。因此,您要求您的一个人去市场购买补给品(那是您的异步​​调用)。

同时你指示女服务员写今天的菜单,所以她写......好吧,什么都没有(那是你的表格视图询问行数)。

现在在 07:00 去市场的那个人带着 10 件物品回来了。更新菜单的下一个合乎逻辑的步骤是什么?实际通知女服务员(那是您的reloadData)您退回的物品。

我希望这是有道理的:)

于 2012-11-01T19:50:11.423 回答
0

什么是 self.topPlaces?尝试 NSLog 数组并查看是否有任何内容。如果没有,请确保它正在设置。

如果您提供更多信息,我将能够写一个更具体的答案。

于 2012-11-01T19:42:46.937 回答