UITableview 委托和数据源调用了两次
UITableview delegate and datasource called twice
我对 table查看数据源和委托方法感到困惑。如果用户导航到那个 table 视图控制器,我有一个 tableview 我正在调用 Web 服务方法,该方法是在请求成功完成后重新加载 tableview 部分但基于块的服务 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
}
那么对此有什么想法吗?非常感谢!
你在viewDidLoad中初始化数据数组了吗?如果您不这样做,它将 return 为空。
如果你想避免两次调用表视图试试这个:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(!data)
return 0;
return yourNumberOfSections;
}
听起来 -tableView:cellForRowAtIndexPath:
被调用只是因为视图已加载并且 table 试图在您从网络服务接收到任何数据之前填充自身。那时,您不会将 self.data
(无论是什么)设置为任何有用的值,因此您得到的是 null
。当您的 Web 服务 returns 一些数据时,完成例程会导致重新加载相关部分,并且 table 绘制数据。
当需要在屏幕上呈现单元格时,tableview 会调用 cellForRowAtIndexPath
。如果 tableview 在它有任何数据之前出现,self.data 将为空。
在 viewDidLoad
中设置 [[self.data = NSMutableArray alloc] init]
(例如)并且在 UIITableView
的 datasource
/delegate
方法中它应该正确 return numberOfRows
等为零,直到您的网络服务填充您的数据。
我对 table查看数据源和委托方法感到困惑。如果用户导航到那个 table 视图控制器,我有一个 tableview 我正在调用 Web 服务方法,该方法是在请求成功完成后重新加载 tableview 部分但基于块的服务 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
}
那么对此有什么想法吗?非常感谢!
你在viewDidLoad中初始化数据数组了吗?如果您不这样做,它将 return 为空。
如果你想避免两次调用表视图试试这个:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(!data)
return 0;
return yourNumberOfSections;
}
听起来 -tableView:cellForRowAtIndexPath:
被调用只是因为视图已加载并且 table 试图在您从网络服务接收到任何数据之前填充自身。那时,您不会将 self.data
(无论是什么)设置为任何有用的值,因此您得到的是 null
。当您的 Web 服务 returns 一些数据时,完成例程会导致重新加载相关部分,并且 table 绘制数据。
当需要在屏幕上呈现单元格时,tableview 会调用 cellForRowAtIndexPath
。如果 tableview 在它有任何数据之前出现,self.data 将为空。
在 viewDidLoad
中设置 [[self.data = NSMutableArray alloc] init]
(例如)并且在 UIITableView
的 datasource
/delegate
方法中它应该正确 return numberOfRows
等为零,直到您的网络服务填充您的数据。