我正在努力使用我以前工作的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;
}
答案 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数组,看看是否有任何内容。如果没有,请确保它已被设置。
如果您提供更多信息,我将能够撰写更具体的答案。