Ios 从ConnectionIDFinishLoading获取数据之前出现的UITableView

Ios 从ConnectionIDFinishLoading获取数据之前出现的UITableView,ios,uitableview,xcode4.2,Ios,Uitableview,Xcode4.2,我的表在从Web服务获取数据之前加载 当我调试它时,我可以看到我的NSMutableArray有123个对象,但它没有反映在表中 这是我的connectiondFinishLoading方法: -(void)connectionDidFinishLoading:(NSURLConnection *)conn{ myData = [[NSString alloc] initWithData:xData encoding:NSUTF8StringEncoding]; SBJsonParser *jP

我的表在从Web服务获取数据之前加载

当我调试它时,我可以看到我的
NSMutableArray
有123个对象,但它没有反映在表中

这是我的
connectiondFinishLoading
方法:

-(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);
}
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath{
...
Book *b = (Book *)[self.bookArray objectAtIndex:[indexPath row]];
cell.textLabel.text = b.bookName;
....
如果我调试它,我将获得我的
jsonObjects
并填充我的集合。但我注意到我的桌子还是空的

请澄清这是我的
tableView
方法:

-(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);
}
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath{
...
Book *b = (Book *)[self.bookArray objectAtIndex:[indexPath row]];
cell.textLabel.text = b.bookName;
....

有人能帮我解决我缺少的东西吗

检查调用线程。除了mainThread之外,您不能在任何东西上更新UIKit。我认为您的ConnectionIDFinishLoading:是在一个单独的线程上调用的,这就是这里的问题

试一试


您需要考虑在没有数据要显示的情况下,以及在有数据显示的情况下,由NUBROWROWSIN部分(和No.FuleFixFipe)返回的内容。每次调用reloadData时,tableView都会调用这两个方法来获取有关数据源的最新信息。如果尚未加载数据,则这些委托方法应报告适当的值。如果未加载数据,可以测试nil值或执行类似的测试,然后返回适当的值。加载数据后,委托方法应根据数据源中内容的大小返回值


如果您向我们展示这些方法的代码,有人可以评论这是否是您的问题。

这是因为这样做的方法是,在内容通过Web服务下载之前不要加载表


因此,不要通过IB设置委托。完成此web请求后,通过代码设置委托和数据源,然后调用
reloadData
方法。因此,我们可以让表等待加载,直到webcall得到处理。在加载数据时,提供一些自定义HUD的整洁活动指示器,这将完成job

让我们看看整个cellForRow方法。您实现了rowsForSection吗?@Dancreek我想您是指numberOfRowsForSection?无论如何,当我读到这个主题时,我怀疑这和[tableview reloadData]。不过,他正在调用重载数据,这消除了后者。-(NSInteger)tableView:(UITableView*)tableView numberofrowsinssection:(NSInteger)section{return bookArray.count;}检查您是否没有多个表视图。我见过一些项目,开发人员在由
UITableViewController
自动添加的表视图上添加了
UITableView
,因此由
self.tableView
表示的表不可见。但基本上self.tableView重载数据应该只是将数据重新绑定到表中?另一方面,在数据完全完成之前,是否有任何方法防止表格出现?我想知道在这种情况下,活动指标会有什么帮助。我需要弄清楚为什么我的表是空的。在第二个问题上,如果你知道内容是空的,你可以设置tableView的
hidden
属性。您可以在我提到的一个delegate方法中执行此操作。当有内容要显示时,记得取消隐藏它(hidden=NO)。-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{//返回节数。返回1;}-(NSInteger)tableView:(UITableView*)tableView numberofrowsinssection:(NSInteger)节{返回bookArray.count;}我对这些方法没有太多的了解。我只是调试了我的程序,它在数组填充数据之前调用了numberOfRowsInSection 1次,从此不再调用它。在这个过程中,你能在任何地方释放或发送nil消息到表视图吗?请在向下运行时添加注释设置委托就可以了。在数据源方法中,他应该考虑下载是否已完成。“他应该考虑下载是否已完成。”这意味着?@LeoNatan为什么在知道没有值可加载时调用委托和所有方法?这意味着如果数据未准备好,他应该在
表视图:numberofrowsinssection:
中返回0。一旦连接完成并且数据准备就绪,他应该将
reloadData
消息传递到表视图,或者更好的是,单独重新加载每个单元格以获得更好的动画效果。