1

所以我有一个 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 之神的方式做我想做的事?

4

2 回答 2

2

检查 textViewShouldBeginEditing 是否被调用了两次。我注意到这些类型的委托调用有时是。

于 2012-12-12T16:55:28.877 回答
0

你的@"editMemoSegue" 是如何在情节提要上创建的?它是从 textView 创建的吗?如果是,那么您应该直接从视图控制器或从视图控制器的顶部状态栏重新创建它,这样当您触摸触发器对象和以编程方式调用它时,它不会被调用两次。

于 2012-12-09T18:56:03.997 回答