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