使用自定义 UIButton 删除 UITableViewCell
Posted
技术标签:
【中文标题】使用自定义 UIButton 删除 UITableViewCell【英文标题】:Delete UITableViewCell using custom UIButton 【发布时间】: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] 时在每次删除之前设置断点...或断言该行小于计数。此外,您是否有可能在不刷新表格的情况下删除多个项目? 我会尝试断点,但是是的,我已经尝试在我的viewDidLoad
和viewWillAppear
中重新加载我的tableView
。
我在删除函数之前和之后做了一个 if 语句,并写了一个日志,但我不知道它是如何工作的。
我希望如果您在 indexPath.row 超出数组末尾的位置遇到断点,就可以看到事情是如何不同步的。 (可能是 globalIndexPath 的逻辑。)
【参考方案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
等于我的按钮那我要怎么声明呢?
不,我没有在我的自定义单元格中声明协议或委托。我将更新我的代码,向您展示我在点击按钮时的操作。以上是关于使用自定义 UIButton 删除 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章
如何使 UIButton 从 UITable 中的选择中播放相应的音频剪辑?
Swift 3 - 自定义 UIButton 半径删除约束?
如何从 UITableViewCell 中的自定义 UIButton 中删除触摸延迟