0

我有一个UITableViewNSArray.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return self.data.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"CellIdentifier";
  UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];

  }
  id item = [self.data objectAtIndex:indexPath.row];
  cell.item = item;

  return cell;
}

很标准。现在的问题是,它reloadData会同步请求numberOfSectionsnumberOfRows但会cellForRow异步调用。所以有时,当cellForRowAtIndexPath被调用时,数据数组已经改变,因此[self.data objectAtIndex:indexPath.row]会出现越界异常并使应用程序崩溃。我该如何避免这种情况?

请注意,每次设置data数组时,我也会调用[self.tableView reloadData].

4

4 回答 4

0

我认为避免这种情况的最好方法是在数据更新时避免用户交互。也许你可以向用户显示一个“正在更新..”的屏幕和一个活动指示器。

另一种方法是让另一个数组填充新数据,处理可以在单独的线程中完成,有时只将它分配回数据源数组,然后重新加载调用。在数据源数组时也可以使用相同的屏幕变了

于 2012-10-18T05:17:01.387 回答
0

cellForRowAtIndexPath被频繁调用,(在滚动等),你可以添加一个简单的代码行来检查数据数组的大小是否小于被请求的单元格。尽管这意味着您最终可能会得到空白单元格。

我会在这两种方法上设置断点,右键单击断点->“编辑断点”并勾选“评估后自动继续”。然后单击“添加操作”->“调试器命令”,然后键入“po data”或“po [data count]”。

每次命中断点时,这将在调试控制台中打印有关数组的信息(不停止)。然后,您应该能够查看调试输出并查看它在哪里不同步。添加一些NSLog语句来告诉您正在调用哪个方法等并从那里开始工作。

于 2012-10-17T23:52:07.303 回答
0

我使用的快速破解,试试这个,看看它是否适合你:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"CellIdentifier";
  UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];

  }

  // -----------------------------------------------------------------
  // the magical line that prevents the table from fetching the data
  // -----------------------------------------------------------------
  if([indexPath row] < [self.data count])
  {

      id item = [self.data objectAtIndex:indexPath.row];
      cell.item = item;
  }

  return cell;
}

:D

于 2012-10-18T08:34:45.803 回答
0

您应该存储一个不会被修改的本地数组。然后,当您的基本数组发生更改时,您可以安全地更新存储的数组。查看使用内置 api 从表视图中添加/删除单元格将行添加到现有 UITableView 部分

于 2012-10-18T15:22:20.507 回答