使用自定义UIButton删除UITableViewCell

时间:2012-04-03 11:03:17

标签: iphone uibutton nsindexpath

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

  

*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* - [__ NSArrayM removeObjectAtIndex:]:索引1超出边界[0 .. 0]'

以下是我的代码的结构。我有一个自定义UITableViewCell,其中包含UIButton,其中包含删除单元格的操作。删除单元格的操作位于我的主View控制器中,其中包含单元格的实际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删除单元格。

1 个答案:

答案 0 :(得分:1)

如果要在cellForRowAtIndexPath(以及其他地方)中设置globalIndexPath,则globalIndexpath将始终知道最后一个单元格的indexPath,该单元格已创建或出列,用户可能实际使用该按钮。似乎已经被设计破坏了。或者你的细胞是否只有一个可见?

首先,我会尝试在UIButton

中设置您的cellForRowAtIndexPath个单元格的标记
myButton.tag = indexPath.row + SOMEOFFSETTOASSUREYOURTAGDOESNTGET0;

然后通过此标记在您的操作中获取indexPath:

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

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

<强>更新

虽然技术上可能(误)使用NSNotificationCenter来做你正在做的事情,但我真的建议你完成这个tutorial