UITableview委托和数据源调用两次

时间:2015-02-10 20:11:06

标签: ios objective-c delegates tableview datasource

我在使用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 
}

那么有什么想法吗?非常感谢你!

3 个答案:

答案 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服务返回一些数据时,完成例程会导致重新加载相关部分,并且表将绘制数据。