Iphone 使用自定义UI按钮删除UITableViewCell

Iphone 使用自定义UI按钮删除UITableViewCell,iphone,uibutton,nsindexpath,Iphone,Uibutton,Nsindexpath,我在尝试使用自定义按钮删除单元格时遇到此错误 *由于未捕获异常“NSRangeException”而终止应用程序,原因:'*-[\uu NSArrayM removeObjectAtIndex:]:索引1超出边界[0..0]' 下面是我的代码的结构。我有一个自定义的UITableViewCell,其中包含一个ui按钮,该按钮有一个删除单元格的操作。删除单元格的操作在我的主视图控制器中,该控制器包含单元格的实际indepath。这个结构很好用 下面是删除单元格的操作 NSIndexPath *in

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

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

下面是我的代码的结构。我有一个自定义的
UITableViewCell
,其中包含一个
ui按钮,该按钮有一个删除单元格的操作。删除单元格的操作在我的主视图控制器中,该控制器包含单元格的实际
indepath
。这个结构很好用

下面是删除单元格的操作

NSIndexPath *indexPath = [self globalIndexPath];

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

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationFade];
当我在上面声明
indexPath
时,在我的
cellforrowatinexpath
中设置了
globalIndexPath
属性,为其提供原始
indexPath
的值。我就是这样宣布的

[self setGlobalIndexPath:indexPath];
现在我在这里放置了一些
nslog
,在那里记录
indepath
。例如,在
视图将出现
方法和
视图加载
方法中,这两种方法都给我提供了准确的
索引XPath
,我甚至检查了
数组
输出,它们都返回了准确的结果,所以我真的不知道为什么它会给我错误

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

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];
}

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

如果您在
cellforrowatinexpath
中设置globalIndexPath(其他地方都没有),globalIndexPath将始终知道最后一个单元格的indexPath,而不是用户实际使用按钮的单元格。似乎已经被设计打破了。还是你的细胞太大,只有一个可见

首先,我会尝试在
cellforrowatinexpath

myButton.tag = indexPath.row + SOMEOFFSETTOASSUREYOURTAGDOESNTGET0;
然后通过以下标记获取操作中的indexPath:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(UIButton*)sender.tag - OFFSET inSection:0];
当然,只有在只有一个部分的情况下才有效。如果需要处理多个节,可以使用一个包含所有indexPath的数组,并将
ui按钮的标记设置为数组中该indexPath的索引

更新


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

如果您在
单元格中设置globalIndexPath for RowatinexPath
(其他任何地方),globalIndexPath将始终知道最后一个单元格的indexPath,它被创建或退出队列,而不是用户实际使用按钮的位置。似乎已经被设计打破了。还是你的细胞太大,只有一个可见

首先,我会尝试在
cellforrowatinexpath

myButton.tag = indexPath.row + SOMEOFFSETTOASSUREYOURTAGDOESNTGET0;
然后通过以下标记获取操作中的indexPath:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(UIButton*)sender.tag - OFFSET inSection:0];
当然,只有在只有一个部分的情况下才有效。如果需要处理多个节,可以使用一个包含所有indexPath的数组,并将
ui按钮的标记设置为数组中该indexPath的索引

更新



虽然在技术上可能(错误地)使用
NSNotificationCenter
执行您正在执行的操作,但我确实建议您仔细检查此操作。

尝试在每次删除之前当[indexPath row]大于等于[self.array count]时设置断点……或者断言行小于count。另外,您是否有可能在不刷新表的情况下删除多个项目?我将尝试断点,但是的,我已尝试在我的
viewDidLoad
中重新加载我的
tableView
,并且
viewwillbeen
。我在删除函数之前和之后都执行了if语句,并放入一个日志,但我不知道它到底是如何工作的。我希望如果您遇到一个断点,其中indexPath.row超出了数组的末尾,就可以看到事情是如何不同步的。(可能是globalIndexPath的逻辑。)尝试在每次删除之前当[indexPath行]大于等于[self.array count]时设置断点……或者断言该行小于count。另外,您是否有可能在不刷新表的情况下删除多个项目?我将尝试断点,但是的,我已尝试在我的
viewDidLoad
中重新加载我的
tableView
,并且
viewwillbeen
。我在删除函数之前和之后都执行了if语句,并放入一个日志,但我不知道它到底是如何工作的。我希望如果您遇到一个断点,其中indexPath.row超出了数组的末尾,就可以看到事情是如何不同步的。(可能是globalIndexPath的逻辑。)我的操作在主视图控制器中,它只是一个简单的
void
。用于声明
indepath
的代码返回一个错误,表示发送方未声明。它应该是我的按钮吗?您是否定义了协议并在自定义的
UITableViewCell
中使用委托来调用该操作?是的,发送方应该是您的UIButton。我的操作不在自定义单元格类中,而是在我从中获取
indexPath
的类中,我正在使用
NSNotificationCenter
将操作发布到我的自定义单元格类,因此如果
sender
等于我的按钮,那么我将如何声明它?不,我没有在自定义单元格中声明协议或委托。我将更新我的代码,以便在点击按钮时向您显示我的操作。我的操作在主视图控制器中,它只是一个简单的
void
。用于声明
indepath
的代码返回一个错误,表示发送方未声明。它应该是我的按钮吗?您是否定义了协议并在自定义的
UITableViewCell
中使用委托来调用该操作?是的,发件人应该是您的UIButton。我的操作不在自定义单元格类中,它是i