Objective c 填充UITableView

Objective c 填充UITableView,objective-c,uitableview,xcode4.5,Objective C,Uitableview,Xcode4.5,我正在努力与我以前工作过的UITableView抗争,但不知何故我打破了它! 它是Paul Hegarty课程中单元的一部分 症状是视图已加载但为空。我显然误解了一些相当基本的东西 据我所知,这两个关键方法是1节行计数,在我的例子中,它返回零,我知道这是错误的 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // #warning Incomple

我正在努力与我以前工作过的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中,我可以将数据记录到控制台,一切都正常。i、 e.我的数据是在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;

}

什么是self.topPlaces?尝试记录阵列并查看是否有任何内容。如果没有,请确保它已设置


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

什么是self.topPlaces?尝试记录阵列并查看是否有任何内容。如果没有,请确保它已设置


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

问题是您进行了一个异步调用来获取数据(这意味着您的数组在将来的某个时候应该充满了数据),但之后您不会重新加载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的评论中看到,他不完全确定为什么问题会通过
重新加载数据来解决。
好吧,让我们举个例子:

假设你有一家餐馆

你在早上6点开门,你会发现你没有什么可煮的。因此,您要求您的一名员工前往市场购买供应品(这是您的异步呼叫

同时你指示一位女服务员写今天的菜单,所以她写。。。嗯,没有什么(这是您的表视图要求的行数)

现在7点,那个去市场的家伙带着10件东西回来了。更新菜单的下一个逻辑步骤是什么?实际通知女服务员(这是您的
重新加载的数据
)您退回的物品


我希望这是有意义的:)

问题是您进行了一个异步调用来获取数据(这意味着您的数组在将来的某个时候应该充满数据),但之后您不会重新加载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的评论中看到,他不完全确定为什么问题会通过
重新加载数据来解决。
好吧,让我们举个例子:

假设你有一家餐馆

你在早上6点开门,你会发现你没有什么可煮的。因此,您要求您的一名员工前往市场购买供应品(这是您的异步呼叫

同时你指示一位女服务员写今天的菜单,所以她写。。。嗯,没有什么(这是您的表视图要求的行数)

现在7点,那个去市场的家伙带着10件东西回来了。更新菜单的下一个逻辑步骤是什么?实际通知女服务员(这是您的
重新加载的数据
)您退回的物品


我希望这是有意义的:)

是的,我可以很好地记录内容。从上面提供和接受的答案来看,我的理解是,因为我正在进行一个异步调用,所以tableview只是继续进行并加载,而该调用的结果不在数组中。“重新加载数据”解决了这个问题,我不完全确定原因,但现在可以开始了。@nerak99请参阅我的进一步解释。它会让你明白的。是的,我可以很好地记录内容。从上面提供和接受的答案来看,我的理解是,因为我正在进行一个异步调用,所以tableview只是继续进行并加载,而该调用的结果不在数组中。“重新加载数据”解决了这个问题,我不完全确定原因,但现在可以开始了。@nerak99请参阅我的进一步解释。这会让你明白的。我喜欢和餐馆的类比+1.喜欢与餐厅的类比+1.