我有一种情况,我的表在从webservice获取数据之前加载。
当我调试它时,我可以看到我的NSMutableArray
有123个对象,但它没有反映在表中。
这是我的connectionDidFinishLoading
方法:
-(void)connectionDidFinishLoading:(NSURLConnection *)conn{
myData = [[NSString alloc] initWithData:xData encoding:NSUTF8StringEncoding];
SBJsonParser *jParser = [SBJsonParser new];
NSError *error = nil;
NSArray *jsonObjects = [jParser objectWithString:myData error:&error];
NSMutableArray *books = [[NSMutableArray alloc] init];
for(NSDictionary *dict in jsonObjects)
{
Book *b = [Book new];
b.bookName =[dict objectForKey:@"name"];
b.published = [dict objectForKey:@"published"];
[books addObject:b];
}
self.bookArray = books;
[self.tableView reloadData];
NSLog(@"myData = %@",myData);
}
如果我调试了这个,我将获得jsonObjects
并填充我的收藏。但我发现我的桌子还是空的。
只是为了澄清这是我的tableView
方法:
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
...
Book *b = (Book *)[self.bookArray objectAtIndex:[indexPath row]];
cell.textLabel.text = b.bookName;
....
任何人都可以帮助我解决我所缺少的问题吗?
答案 0 :(得分:1)
检查调用线程。你不能在除mainThread之外的任何东西上进行UIKit更新。我认为你的connectionDidFinishLoading:在一个单独的线程上调用,这就是问题所在。
尝试
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
答案 1 :(得分:1)
对于没有要显示数据的情况以及有数据要显示的情况,您需要考虑numberOfRowsInSection(和numberOfSections)返回的内容。每次调用reloadData时,tableView都会调用这两个方法来获取有关数据源的最新信息。如果您的数据尚未加载,则这些委托方法应报告适当的值。如果未加载数据,则可以测试nil值或执行类似的测试,然后返回适当的值。加载数据后,委托方法应根据数据源中内容的大小返回值。
如果您向我们展示了这些方法的代码,有人可以评论这是否是您的问题。
答案 2 :(得分:1)
这是因为这样做的方法是,在通过网络服务下载内容之前不要加载表格。
为此,不要通过IB设置代表。完成此Web请求后,通过代码设置委托和数据源,然后调用reloadData
method.Hence我们可以让表等待加载直到网络连接被处理。提供一些自定义HUD的整洁活动指示器加载,这将完成工作