嵌套推送动画可能导致导航栏损坏

时间:2012-04-11 23:09:28

标签: iphone objective-c ios ipad

在我的一个viewcontroller中,让我们说A,我有以下内容:

 OnbViewController *on = [[OnbViewController alloc] initWithNibName:nibName bundle:nil];
        onboardingTutorial.delegate_ = self;
self.test = on
 UINavigationController *nController = [[UINavigationController alloc] initWithRootViewController:self.test]
[self presentModalViewController:nController]
[nController release];

然后在OnbViewController中我已经推送到navigationController:

[self.navigationController pushViewController:someViewController];

然后在didSelectRowForIndexPath中:我调用了一个委托,它是A,在我调用的委托函数中我尝试再次执行:

[self.test pushViewController:someOtherViewController];

然后这给了我那个错误:

nested push animation can result in corrupted navigation bar
Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
   Unbalanced calls to begin/end appearance transitions for <someOtherViewController: 0x6f942e0>.

任何想法?

2 个答案:

答案 0 :(得分:2)

相当复杂的调用序列,但我看到的第一个问题是它看起来像是在OnbViewController上调用pushViewController,而不是在其navigationController上调用。也许更改为[self.test.navigationController pushViewController:someOtherViewController];就足够了?

编辑:在进一步观察时,我注意到“嵌套推动画”中的“动画”。是onbViewController在viewWillAppear期间推送到someViewController还是在那之前的某个地方?也许跳过第二个动画会有用吗?

答案 1 :(得分:0)

这是一个真正纠缠在那里的指针。 self.test是导航控制器(nController)的根vc。您以模态方式呈现nController,然后将其他视图控制器推送到它的vc堆栈。

然后,当那个堆栈仍然存在时,你会进入self.test,就像再次推入root。

让获取didSelectRow消息的VC执行推送。你仍然可以告诉代表它发生了。