我在使用tableview数据源和委托方法。我是一个tableview,如果用户导航到该表视图控制器我在请求成功重新加载tableview部分之后调用基于块的服务的Web服务方法,但 tableView:cellForRowAtIndexPath:indexPath 叫了两次。这是我的代码。
viewDidLoad中
[[NetworkManager sharedInstance].webService getValues:self.currentId completion:^(NSArray *result, BOOL handleError, NSError *error) {
self.data = result[0];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 4)] withRowAnimation:UITableViewRowAnimationAutomatic];
});
}
但是第一次cellForRowAtIndexPath self.data值为null。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"%@", self.data); // first time it print null
}
那么有什么想法吗?非常感谢你!
答案 0 :(得分:4)
您是否在viewDidLoad中初始化数据数组?如果没有,它将返回null。
如果你想避免两次调用tableview,试试这个:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(!data)
return 0;
return yourNumberOfSections;
}
答案 1 :(得分:1)
当需要在屏幕上呈现单元格时,tableview会调用cellForRowAtIndexPath
。如果tableview在有任何数据之前出现,则self.data将为空。
在viewDidLoad
设置[[self.data = NSMutableArray alloc] init]
(例如)以及datasource
的{{1}} / delegate
方法中,它应正确返回UIITableView
等在您的Web服务填充数据之前为零。
答案 2 :(得分:0)
听起来-tableView:cellForRowAtIndexPath:
被调用只是因为视图已加载并且表在您从Web服务收到任何数据之前尝试填充自己。此时,您不会将self.data
(无论是什么)设置为任何有用的值,因此您将获得null
。当您的Web服务返回一些数据时,完成例程会导致重新加载相关部分,并且表将绘制数据。