tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃

Posted

技术标签:

【中文标题】tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃【英文标题】:tableView:canEditRowAtIndexPath: crash when popping viewController 【发布时间】:2013-10-07 16:55:01 【问题描述】:

我有一个带有UITableView 的视图控制器,我允许通过滑动编辑(删除)其中的行——就像在邮件应用程序中一样。除其他外,我使用以下方法:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 

    return YES;

但是,如果我有一个删除按钮,同时我使用 UINavigationController 的后退导航,即当我 popViewControllerAnimated: 时,应用程序崩溃并显示以下消息:

[ViewController tableView:canEditRowAtIndexPath:]:消息发送到已释放实例 0xaae64d0

我该如何解决这个问题?

【问题讨论】:

在视图控制器的dealloc 方法中,将表格视图的editing 属性设置为NO 并将其delegatedataSource 属性设置为nil。虽然你不得不这样做很奇怪...... 太棒了!您的第一个评论是当场的,其他两个电话是不必要的。如果您创建一个,我将很乐意接受您的回答。 这个错误在 2015 年 3 月仍然存在(ios 8.2,XCode 6.2)。在 cmets 中给出了很好的建议,我只是在 UIViewController 的“viewWillDisappear”函数中添加了“tableView.editing = false”。这足以阻止应用程序完全崩溃! 【参考方案1】:

在视图控制器的dealloc 方法中,将表格视图的editing 属性设置为NO

【讨论】:

这可行,但它只在 iOS7 中开始发生。知道为什么吗? 希望我们都提交了错误报告 :) 起初,我认为这是由于系统错误导致的随机崩溃,因为 crashlytics 告诉我只有少数人(在数千人中)有这个问题。现在我知道原因并修复了我的应用程序! 不错的发现。我看到 Apple 还没有解决这个问题。【参考方案2】:

我遇到了同样的问题,但我使用的是 ARC,我不想在 dealloc 方法中胡闹。在 viewWillDisappear 中执行此操作足以阻止崩溃。

- (void)viewWillDisappear:(BOOL)animated 
    [super viewWillDisappear:animated];
    [table setEditing:NO];

【讨论】:

ARC下有dealloc方法只要不调用[super dealloc]就错了吗? 没有错。接受的答案不会破坏任何东西,并且会正常编译。您实际上不允许拨打[super dealloc]release,因为ARC 应该为您拨打电话。我的建议主要是为了减少混淆,因为当我的其他类都没有一个不寻常的 dealloc 方法时,我不想要一个不寻常的 dealloc 方法。在对象可能被释放之前对其设置属性也感觉很奇怪。 如果你展示其他的vcs等,这个方法有时会导致奇怪的行为,所以我会使用dealloc方法。 viewDidDisappear: 也可以工作,在这种情况下我更喜欢这样做,因为用户看不到 tableview 从编辑状态过渡。 我知道这是一个小细节,但最好调用 [table setEditing:animated] 让系统决定是否为动画过渡。【参考方案3】:

    使用

    tableview.delegate = nil in dealloc()

    使用

    tableView=nil

【讨论】:

【参考方案4】:

我知道这是一篇旧帖子,但我最近遇到了这个问题,并认为其他人可能会从我的发现中受益:我正在使用 Xcode 9 和 iOS 11,并且我正在采用使用 SearchController 的新方法。如果我在搜索时单击系统后退按钮,则会在 tableView(_: canEditRowAt indexPath:) 上得到致命错误。将 setEditing 更改为 false 并没有解决我的问题。问题是我在 canEditRowAt 覆盖中返回真/假,具体取决于我的数据源是否有记录,但是当我搜索时,我有一个不同的数据源(过滤数组)。一旦我检查了正确的数据源,后退按钮就起作用了。

【讨论】:

以上是关于tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章