所以我有一个iPhone应用程序。它具有简单的结构,全部基于UINavigationController
。
我有一个故事板,有一个视图,一个segue到另一个视图等。现在这个其他视图有一个UITextView
,我不想在这个屏幕上编辑 - 如果用户点击这个,我想要它转而飞到第二个基本上具有相同文本视图的屏幕,但这个是全屏的,用户将在该屏幕上编辑文本,然后返回上一个屏幕。
所以我捕获了textViewShouldBeginEditing
方法。我以前在故事板编辑器中手动创建了一个从前一个视图控制器到这个新视图控制器的push 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;
}
似乎合理。它有效。八九不离十。事实上,它确实让我接受了另一种观点。其他视图的事件启动,我将其文本视图设置为第一响应者,我编辑该屏幕上的文本。每个人都很开心。
直到我想使用后退按钮返回上一个视图。
然后我很快发现 - 我的导航堆栈已经消失了。大多数时候,由于某种原因,我有两个我的新编辑控制器在堆栈上的实例,所以我第一次点击后退按钮时,我再次得到相同的东西。然后,奇怪的是,它偶尔会按预期工作,我会看到我以前的控制器只有一次点击。
我开始阅读日志,我发现了这个:
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众神的方式做我想做的事情?
答案 0 :(得分:2)
检查textViewShouldBeginEditing是否被调用两次。我注意到这些代表调用有时是。
答案 1 :(得分:0)
如何在故事板上创建@“editMemoSegue”?它是从textView创建的吗?如果是,那么你应该直接从视图控制器或视图控制器上的顶部状态栏重新创建它,当你触摸触发器对象并以编程方式调用它时,它不会被调用两次。