【问题标题】:UITableview delegate and datasource called twiceUITableview 委托和数据源调用了两次
【发布时间】:2015-04-11 00:40:04
【问题描述】:

我在使用 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 的值在第一次为空。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
      NSLog(@"%@", self.data); // first time it print null 
}

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

【问题讨论】:

  • 你的UITableView的dataSource方法会按照@Kex的建议在屏幕加载后调用,所以第一次是null,第二次重新加载数据会从你的异步块内部触发。
  • 尝试将 reloadSections 代码放在 self.data = result [0] 的下方;不在调度块中。
  • @Kex 我一直在尝试。
  • 抱歉,要清楚一点,它是否打印任何值?它不会在第一个表调用时打印任何内容,但第二个调用是吗?
  • 我现在明白了,如下所述,它被调用了两次。最初在加载时,然后在网络获取后的块中。这段代码没有任何问题。您是否希望 tableview 在您拥有数据或其他内容之前不初始化?

标签: ios objective-c delegates tableview datasource


【解决方案1】:

您是否在 viewDidLoad 中初始化了数据数组?如果你不这样做,它将返回 null。

如果你想避免两次调用 tableview 试试这个:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    if(!data)
        return 0;

    return yourNumberOfSections;
}

【讨论】:

  • 抱歉数据不是数组。但无论如何,如果你没有初始化那个或结果数组,它将返回 null。
  • 对不起。我知道。但必须从api填写。
【解决方案2】:

听起来-tableView:cellForRowAtIndexPath: 被调用只是因为视图已加载,并且表格试图在您从 Web 服务接收到任何数据之前自行填充。那时,您不会将self.data(无论是什么)设置为任何有用的值,因此您会得到null。当您的 Web 服务返回一些数据时,完成例程会导致重新加载相关部分,并且表格会绘制数据。

【讨论】:

    【解决方案3】:

    tableview 需要在屏幕上渲染单元格时调用cellForRowAtIndexPath。如果 tableview 在它有任何数据之前出现,self.data 将为空。

    viewDidLoad 设置[[self.data = NSMutableArray alloc] init](例如)和UIITableViewdatasource/delegate 方法中,它应该正确地将numberOfRows 等返回为零,直到您的网络服务填充您的数据。

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 2013-07-10
      • 2012-07-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2016-01-17
      • 2013-11-22
      相关资源
      最近更新 更多