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关闭的主要内容,如果未能解决你的问题,请参考以下文章