【问题标题】:iOS- deleteRowsAtIndexPaths CrashiOS-deleteRowsAtIndexPaths 崩溃
【发布时间】:2013-01-29 11:32:20
【问题描述】:

我正在尝试使用以下代码进行删除。

[super deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];

它返回多个异常。

 *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:1070
2013-01-29 16:28:22.628 

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第 1 节中的行数。包含在第 1 节中的行数 更新后的现有节(5)必须等于 更新前该部分中包含的行 (5),加号或减号 从该部分插入或删除的行数(0 插入, 5 已删除)加上或减去移入或移出的行数 该部分(0 移入,0 移出)。'

【问题讨论】:

  • 您删除的行数多于实际存在的行数。
  • 确保您的方法- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 在删除前后返回正确的行数。
  • 但是我如何确定索引是否存在。这在没有 ARC 的情况下工作正常。
  • 感谢 AKV 和 CainaSouza。您的建议解决了我的问题。

标签: ios objective-c uitableview ios6


【解决方案1】:

这是因为你应该有一个动态的方式来返回行数。

例如,我创建了 3 个数组。每个都有 3 个值(这些是 NSArray 变量):

.h 文件中:

NSArray *firstArray;
NSArray *secondArray;
NSArray *thirdArray;

.m 文件中,viewDidLoad 或 init 或类似的东西:

firstArray = [NSArray arrayWithObjects:@"Cat", @"Mouse", @"Dog", nil];
secondArray = [NSArray arrayWithObjects:@"Plane", @"Car", @"Truck", nil];
thirdArray = [NSArray arrayWithObjects:@"Bread", @"Peanuts", @"Ham", nil];

当返回表中的行数时,我有:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
         return array.count;
      if (section == 0) {
          return firstArray.count;
      } else if (section == 1) {
          return secondArray.count;
      } else {
          return thirdArray.count;
      }
}

然后,在cellForRow

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    }

    if (indexPath.section == 0) {
    cell.textLabel.text = [firstArray objectAtIndex:indexPath.row];
    } else if (indexPath.section == 1) {
        cell.textLabel.text = [secondArray objectAtIndex:indexPath.row];
    } else {
        cell.textLabel.text = [thirdArray objectAtIndex:indexPath.row];
    }

    return cell;
}

然后我删除@"Dog" 通过在桌子上滑动或您要删除的其他方式。然后,在重新加载表格时,您的数组计数将为 2,因此表格将“知道”它必须仅显示 2 行。基本上,您还需要更新数据源。 它也适用于其他部分。因为您从数组中删除元素,所以行数也会更新。

【讨论】:

猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2017-06-12
  • 2018-03-27
  • 2021-04-17
  • 2013-05-13
相关资源
最近更新 更多