ios7导航栏在VC显示键盘后导致EXC_BAD_ACCESS关闭

Posted

技术标签:

【中文标题】ios7导航栏在VC显示键盘后导致EXC_BAD_ACCESS关闭【英文标题】:ios7 navigationbar causes EXC_BAD_ACCESS after VC with keyboard shown dismiss 【发布时间】:2013-09-26 19:45:20 【问题描述】:

我有一个类似笔记的应用程序:UITableViewController 通过将单个笔记推送到导航堆栈来显示它们。

当我的UITextView 具有 FirstResponder 状态(显示键盘)并且我触摸返回按钮时,就会出现问题。当前视图控制器与预期的动画一起被解除,但导航栏现在坏了!如果我按下任何条形按钮,都会导致 EXC_BAD_ACCESS。

我会说它没有正确过渡。表 VC 也以某种方式损坏,因为在进一步操作时它可能会显示为空......非常奇怪的行为!

顺便说一句,它在 ios5 和 iOS6 上没有造成任何问题,但我使用了自定义的 V 形返回按钮。

我检查了标准的 Notes 应用程序,它就像一个魅力。 诀窍是什么?

非常感谢您的建议!

【问题讨论】:

请考虑在崩溃日志中发布一些代码。 经过一些跟踪,我发现UITableViewController 的viewWillAppear: 和viewDidAppear: 方法在使用活动键盘返回后没有被触发。为什么会这样? mm,是否设置了导航控制器委托? 不,我应该设置它吗?做什么的?该问题仅在键盘处于活动状态时才会出现,如果我在返回导航之前将其关闭,一切都很好。 我有一个问题...如果视图中没有添加任何文本,我将在 textViewDidEndEditing: 中调用 [self.navigationController popViewControllerAnimated:YES];。并且它可能与由 Back 按钮触发的正在进行的 popViewController 动画重叠。 【参考方案1】:

EXC_BAD_ACCESS 表示您正在尝试访问已被释放的对象。您可以做的最好的事情是启用 NSZombie,它会告诉您正在向哪个已发布对象发送消息(又名 EXC_BAD_ACCESS)。

您可以从here获取如何启用它。

【讨论】:

我理解为什么会引发 EXC_BAD_ACCESS 以及导致它的原因,正如我之前在评论中所说的那样。 popViewControllerAnimated: 被调用两次(来自系统的后退按钮和来自textViewDidEndEditing:)。我只是不知道如何正确处理,如何检查后退按钮动画是否已经在进行中...... 尝试退出 [textView resignFirstResponder];在您看来WillDisapear,如果什么都没发生,请编辑您的问题并发布您的代码。 不幸的是,它没有帮助。但我找到了解决办法!我会回答我的问题。非常感谢您的建议。【参考方案2】:

我明白了,并会尝试解释以帮助其他人挽救他们的一天......

EXC_BAD_ACCESS 被引发是因为UITableViewController 在返回弹出动画期间没有正确转换(它的viewWillAppear:viewDidAppear: 方法根本没有被触发)。 反过来,动画也没有正确执行,因为popViewControllerAnimated: 被调用了两次甚至更多次: 1) 作为系统后退按钮回调的一部分; 2) 在textViewDidEndEditing: 内,以防没有输入文本。

解决方法是在调用popViewControllerAnimated:之前检查是否按下了返回键。诀窍是检查详细视图控制器是否仍在导航堆栈中。 这是辅助方法:

-(void) returnToTheListOfRecords 
    self.textView.delegate = nil; // this is to avoid the second call of `textViewDidEndEditing:`
    if ([self.navigationController.viewControllers indexOfObject:self.delegate]==NSNotFound) 
        // Back button has been pressed.
     else 
        [self.navigationController popViewControllerAnimated:YES];
    

问题发生在 iOS7 上只是因为它的全新动画。

【讨论】:

以上是关于ios7导航栏在VC显示键盘后导致EXC_BAD_ACCESS关闭的主要内容,如果未能解决你的问题,请参考以下文章

Swift ios导航栏在被滚动隐藏后不会出现

隐藏状态栏时,我的导航栏在 iOS7 中向上移动

iOS 7 导航栏在翻转水平 Segue 上跳转

隐藏导航栏将视图“向上”移动

导航栏在 iPhone XS Max swift 上关闭视图控制器上的视图

导航栏在动画期间不反映新的文本属性到前一个视图控制器