所以我有一个 iPhone 应用程序。它结构简单,全部基于UINavigationController
.
我有一个故事板,它有一个视图,一个视图到另一个视图,等等。现在这个另一个视图有一个UITextView
我不想在这个屏幕上编辑的 - 如果用户点击它,我希望它飞到第二个screen 基本上具有相同的文本视图,但这个是全屏的,用户将在返回上一个屏幕之前编辑该屏幕上的文本。
所以我捕捉到了这个textViewShouldBeginEditing
方法。我之前在情节提要编辑器中,手动创建了一个从前一个视图控制器到这个新视图控制器的推送 segue,并命名它以便我可以通过它的身份调用它,我这样做:
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
// This is called when the user clicks into the textView as if to edit it.
// Instead of editing it, go to this other view here:
[self performSegueWithIdentifier:@"editMemoSegue" sender:self];
// Return NO, as I don't actually want to edit the text on this screen:
return NO;
}
似乎有道理。它有效。排序。事实上,它确实让我转向了另一种观点。另一个视图的事件启动,我将它的文本视图设置为第一响应者,我在该屏幕上编辑文本。每个人都很高兴。
直到我想使用后退按钮返回上一个视图。
然后我很快发现——我的导航堆栈是 foobared。大多数时候,出于某种原因,我在堆栈上有两个新的编辑控制器实例,所以当我第一次点击后退按钮时,我又得到了同样的东西。然后,奇怪的是,偶尔它会按预期工作,我会看到我以前的控制器只需单击一次。
我开始阅读日志,发现:
2012-12-09 09:41:03.463 APP[8368:c07] nested push animation can result in corrupted navigation bar
2012-12-09 09:41:03.818 APP[8368:c07] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2012-12-09 09:41:03.819 APP[8368:c07] Unbalanced calls to begin/end appearance transitions for <SecondController: 0x83881d0>.
很明显,我在这里做错了。问题是,什么?以及如何以正确安抚 iPhone 框架的 tiki 之神的方式做我想做的事?