尝试使用自定义按钮删除单元格时遇到此错误。
*由于未捕获的异常'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
删除单元格。
答案 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。