填充UITableView

时间:2012-11-01 19:01:15

标签: objective-c uitableview xcode4.5

我正在努力使用我以前工作的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;

}

2 个答案:

答案 0 :(得分:3)

问题是您进行异步调用以获取数据(这意味着您的数组将来某个时候应该充满数据),但之后您不会重新加载tableview。调用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打开这个地方,你发现你没有什么可做的。所以你要求你的一个人去市场寻找用品(那是你的异步电话)。

同时你指示女服务员写今天的菜单,所以她写......好吧,没什么(那是你的 tableview要求行数)。

现在07:00,进入市场的人有10件物品返回。更新菜单的下一个合乎逻辑的步骤是什么?要实际告知女服务员(这是您的reloadData),了解您已退回的商品。

我希望这是有道理的:)

答案 1 :(得分:0)

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

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