【问题标题】:How to delete tableview row in split view controller如何在拆分视图控制器中删除 tableview 行
【发布时间】:2014-08-04 16:01:41
【问题描述】:

我正在尝试删除在我的拆分视图控制器中显示的 tableview 行。当我向左滑动并单击删除时,我的应用程序崩溃了,并且出现错误:

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

我确实设法让重新排列选项适用于表格视图而没有任何错误。对于删除行功能,我做了以下操作:

- (void)tableView:(UITableView *)tableView commitEditingStyle:  (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [_objects removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
    withRowAnimation:UITableViewRowAnimationAutomatic];   
}

但一定有我遗漏的东西。也许是一个简单的更新表格视图。我想我试过了,但没有成功。

我知道在我的项目中仅使用一种方法将很难确定。你可以在这里查看我的整个项目:

https://github.com/mithunan/presidents-splitView

非常感谢任何帮助。

编辑----

这是 numberOfRowsInSection 方法:

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

而且这种方法也可能有帮助......

// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
    id object = [self.presidents objectAtIndex:fromIndexPath.row];
    [_objects removeObjectAtIndex:fromIndexPath.row];
    [_objects insertObject:object atIndex:toIndexPath.row];
}

谢谢

编辑 2 -------------

根据 rmaddy 提供的信息,我更改了 commitEditingStyle...

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.presidents removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

}

但现在我得到一个构建错误:NSArray 没有可见的@interface 声明选择器'removeObjectAtIndex:'

对不起,如果我要求太多,但请您指导我完成这个。

【问题讨论】:

  • 您测试的是哪个版本的 iOS?
  • 我在实际设备上测试了我的 7.0,并在 xcode 5 上的模拟器上测试了 7.1。注意:我在 xcode6 beta 2 中创建了应用程序。但目标是 ios 7.0。
  • iOS 8 中存在错误,但在 iOS 7 下它应该可以工作。两件事:1)在调用commitEditingStyle 时检查_objects 不是nil。 2) 确认您的numberOfRowsInSection 在从_objects 删除对象后返回正确的新行数。
  • 我在 commitEditingStyle 方法的 deleteRowsAtIndexPaths 行和底部调试窗口中添加了一个断点,它说 _objects 为 nil。我对此比较陌生,不确定下一步应该做什么。
  • 那就是问题所在。由于_objectsnil,因此您不会更新数据模型以反映已删除的行。在您的问题中发布您的numberOfRowsInSection 方法。它用什么来返回行数?是_objects 还是别的什么?

标签: ios uitableview nsmutablearray nsindexpath


【解决方案1】:

每当您更改表视图模型时,添加beginUpdatesendUpdates 方法调用总是一个好主意:

- (void)tableView:(UITableView *)tableView commitEditingStyle:  (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView beginUpdates];
    [_objects removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                     withRowAnimation:UITableViewRowAnimationAutomatic];
    [tableView endUpdates];
}

来自beginUpdates方法的文档:

开始一系列插入、删除或选择行的方法调用,然后 接收器的部分。如果需要后续调用此方法 插入、删除和选择操作(例如, cellForRowAtIndexPath: 和 indexPathsForVisibleRows) 被动画化 同时地。这组方法必须以调用结束 结束更新。这些方法对可以嵌套。如果你不做 此块、表内的插入、删除和选择调用 行计数等属性可能会变得无效。你不应该打电话 组内重载数据;如果您在组内调用此方法, 您需要自己执行任何动画。

【讨论】:

  • 当只调用一次删除、插入或重新加载行时,不需要使用begin/endUpdates
  • @rmaddy 我并不是说在所有情况下都必须这样做,但根据我的经验,当多个更新表格视图的调用同时发生时,它可能会解决一些奇怪的行为。
  • 但这里不是这样。这是一个简单的滑动删除,只需拨打deleteRows。似乎数据源正在根据需要进行适当的更新。不需要使用begin/endUpdates。现在说了这么多,iOS 8 似乎确实有一堆表格视图错误。我遇到了好几个。您的答案实际上确实可以解决 iOS 8 错误,但这不是必需的。
  • 我尝试添加您的建议,但仍然遇到同样的错误。
  • @rmaddy 是的,我也不得不处理 iOS 8 上的UITableView 错误,这个解决方法对我有帮助。如果它解决了问题,调用这些方法并没有什么坏处,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多