【问题标题】:Delete UITableViewCell using custom UIButton使用自定义 UIButton 删除 UITableViewCell
【发布时间】:2012-04-03 11:03:17
【问题描述】:

我在尝试使用自定义按钮删除单元格时遇到此错误。

* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM removeObjectAtIndex:]: index 1 beyond bounds [0 .. 0]”

我的代码结构如下。我有一个自定义UITableViewCell,其中包含一个UIButton,它有一个删除单元格的操作。删除单元格的操作在我的主视图控制器中,其中包含单元格的实际indexPath。这种结构工作正常。

这是删除单元格的操作。

NSIndexPath *indexPath = [self globalIndexPath];

[self.array removeObjectAtIndex:[indexPath row]];
[db deleteTaskAtIndex:[indexPath row]];

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationFade];

当我在上面声明indexPath 时,globalIndexPath 属性在我的cellForRowAtIndexPath 中设置,赋予它原始indexPath 的值。这就是我宣布它的方式。

[self setGlobalIndexPath:indexPath];

现在我在这里和那里放置了一些NSLogs 来记录indexPath。例如在viewWillAppear 方法和viewDidLoad 方法中,都给了我准确的indexPath,我什至检查了array 的输出,它们都返回了准确的结果,所以我真的不知道为什么它给了我错误。

这是我的自定义单元格中的代码,用于检测何时点击按钮。

NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications];
if (!notificationArray || !notificationArray.count)
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DeleteSignal" object:nil];
}
else
{
    UILocalNotification *notif = [notificationArray objectAtIndex:[checkbox tag]];
    [[UIApplication sharedApplication] cancelLocalNotification:notif];
}

然后我使用NSNotificationCenter 和键DeleteSignal 删除单元格。

【问题讨论】:

  • 尝试在 [indexPath row] >= [self.array count] 时在每次删除之前设置断点...或断言该行小于计数。此外,您是否有可能在不刷新表格的情况下删除多个项目?
  • 我会尝试断点,但是是的,我已经尝试在我的viewDidLoadviewWillAppear 中重新加载我的tableView
  • 我在删除函数之前和之后做了一个 if 语句,并写了一个日志,但我不知道它是如何工作的。
  • 我希望如果您在 indexPath.row 超出数组末尾的位置遇到断点,就可以看到事情是如何不同步的。 (可能是 globalIndexPath 的逻辑。)

标签: iphone uibutton nsindexpath


【解决方案1】:

如果您在 cellForRowAtIndexPath 中设置 globalIndexPath(其他任何地方都没有),那么 globalIndexpath 将始终知道最后一个单元格的 indexPath,该单元格被创建或出列,不是用户可能实际使用按钮。似乎已经被设计破坏了。还是你的细胞大到只有一个可见?

起初我会尝试在cellForRowAtIndexPath中设置你的单元格的UIButton的标签

myButton.tag = indexPath.row + SOMEOFFSETTOASSUREYOURTAGDOESNTGET0;

然后通过这个标签获取你的action中的indexPath:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(UIButton*)sender.tag - OFFSET inSection:0];

当然,这只有在你只有一个部分时才有效。如果您需要处理多个部分,您可以使用包含所有 indexPaths 的数组,并将 UIButton 的标记设置为数组中该 indexPath 的索引。

更新

虽然在技术上可以(错误地)使用NSNotificationCenter 来完成您正在做的事情,但我真的建议您浏览一下tutorial

【讨论】:

  • 我的动作在主视图控制器中,它只是一个简单的void。您声明indexPath 的代码返回一个错误,指出未声明发件人。它应该是我的按钮吗?
  • 您是否定义了协议并在您的自定义 UITableViewCell 中使用委托来调用该操作?
  • 是的,发件人应该是你的 UIButton。
  • 我的操作不在我的自定义单元格类中,它在我从中获取 indexPath 的类中,我正在使用 NSNotificationCenter 将操作发布到我的自定义单元格类中,所以如果sender 等于我的按钮那我要怎么声明呢?
  • 不,我没有在我的自定义单元格中声明协议或委托。我将更新我的代码,向您展示我在点击按钮时的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多