iPhone导航问题 - 嵌套推动动画可能导致导航栏损坏

68

我一直收到以下错误:

2011-04-02 14:55:23.350 AppName[42430:207] nested push animation can result in corrupted navigation bar
2011-04-02 14:55:23.352 AppName[42430:207] nested push animation can result in corrupted navigation bar
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

这是我的做法。从一个视图控制器中,当某个按钮被按下时,我调用以下代码:

EventsViewController *viewController = [[EventsViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBar.tintColor = [UIColor blackColor];
[self presentModalViewController:navController animated:YES];
[viewController release];
[navController release];

然后,如果在EventsController中按下了某个按钮,我会调用:

SingleEventViewController *viewController = [[SingleEventViewController alloc] initWithEvent:[currentEvents objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

然后,在SingleEventViewController中如果某个按钮被按下,我会调用:

EventMapView* viewController = [[EventMapView alloc] initWithCoordinates];
[[self navigationController] pushViewController:viewController animated:YES];
[viewController release];

显然存在嵌套的push动画,但这是正确的做法吗?我查看了苹果的DrillDownSave代码,这似乎是他们的做法。我使用init方法而不是viewDidLoad方法有关系吗?

20个回答

1

这个问题已经有人回答了,但我认为这可能会帮助其他人,因为我遇到了相同的错误,但没有使用表视图。最终我找出了问题所在。

我有一个现有的按钮,它的IBAction调用了pushViewController。我复制了现有的按钮创建了一个新按钮。新按钮也有一个调用pushViewController的动作。当点击新按钮(touch up inside)并推送视图控制器时,我得到了这个错误。我删除了新按钮,从头开始创建它,将其绑定到现有的输出和操作,然后错误消失了。


0
这是因为我的UIControlEvents发生了这种情况。
    [button addTarget:self action:@selector(callSecondView) forControlEvents:UIControlEventAllTouchEvents];

我不得不将 UIControlEventAllTouchEvents 更改为 UIControlEventTouchUpInside,或者根据您的按钮工作方式进行更改,如果您因 UIButton 调用而遇到了问题。


0

不知道别人怎么样,但我认为大多数使用StoryBoard的人都会遇到这样的问题。我正在使用XIB。

在我的情况下,问题是当我使用push切换到另一个视图时,我也在使用

 [self.navigationController popViewControllerAnimated:YES];

在当前视图的ViewWillDisappear中同时执行。只需删除它即可正常工作。

我使用POP,因为有要求和流程。层次结构是1->2->3

我在视图2上,想要移动到视图3。在这种情况下,我遇到了这个错误。


0
我也遇到了这个错误消息,导航栏和导航控制器的转换也很奇怪。我的设置是一堆嵌入在选项卡栏控制器中的导航控制器。问题在于我没有在选项卡栏控制器实现的viewDidLoad中调用super.viewDidLoad()
当覆盖viewDidLoad时,文档清楚地指出应该调用super,我是通过吃亏才学会的。
也许这可以帮助其他人!

0

1) 或许你可以在推送 UIViewController 之前将必要的变量作为属性传递,而不是使用带参数的 init 方法。很可能你会在 init 方法之外需要这些参数。

此外,在你的 initWithCoordinates: 方法中,你缺少了参数。可能你的自定义 init 方法是问题的一部分。

2) 只是因为你提到了 viewDidLoad -- 这个方法是用于视图加载后的初始化。如果你在代码中创建 UIViewController,就像你似乎做的那样,你应该使用 loadView 来设置你的子视图。


initWithCoordinates方法目前还没有参数。我计划添加它们,但是遇到了这个问题,被卡在调试上无法继续。然而,为什么SingleEventViewController也不是这种情况呢?它在init中需要设置参数。谢谢,我会尝试使用loadView。 - joshholat

0
在我的情况下,我既从故事板中设置了推送转场,也进行了编程设置。希望这能帮助任何人。

0

我知道这个问题已经有答案了,但它可能会帮助到其他人。

我曾经遇到过同样的问题,但是原因是我在信息按钮上使用了错误的事件。我使用了"UIControlEventAllTouchEvents",这导致同一个视图被推入导航控制器两次。正确的事件应该是"UIControlEventTouchUpInside"。我是iOS的新手。


0

我的解决方案是

[self performSelector:@selector(moveTo)withObject:nil afterDelay:0.5];


-1

这个解决了问题:

https://github.com/nexuspod/SafeTransition

如果你用动画(animated:YES)推送(或弹出)一个视图控制器,它不会立即完成,如果在动画完成之前再次推送或弹出会发生一些不好的事情。

为了重现这个错误,请尝试同时推送或弹出两个视图控制器。例如:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    UIViewController *vc = [[UIViewController alloc] init];
    [self.navigationController pushViewController:vc animated:YES];
}

您将收到以下错误信息:

2014-07-03 11:54:25.051 Demo[2840:60b] 嵌套推送动画可能导致导航栏损坏 2014-07-03 11:54:25.406 Demo[2840:60b] 在意外状态下完成导航转换。导航栏子视图树可能会受损。

只需将代码文件添加到您的项目中,并将您的导航控制器设置为APBaseNavigationController的子类,您就可以轻松解决问题。


-1
只是为了完整列表,这里是另一个可能导致“嵌套推送动画可能会导致损坏的导航栏”的原因:
我在TabBarController中设置了几个NavigationController,并在storyboard Identifiy属性中设置了selectedIndex。将活动选项卡移动到代码后,错误消失了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接