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

jos*_*lat 69 iphone uinavigationcontroller navigationcontroller ios4

我一直收到以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

这就是我在做的事情.从视图控制器,我按下某个按钮时调用以下内容:

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];
Run Code Online (Sandbox Code Playgroud)

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

SingleEventViewController *viewController = [[SingleEventViewController alloc] initWithEvent:[currentEvents objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];
Run Code Online (Sandbox Code Playgroud)

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

EventMapView* viewController = [[EventMapView alloc] initWithCoordinates];
[[self navigationController] pushViewController:viewController animated:YES];
[viewController release];
Run Code Online (Sandbox Code Playgroud)

所以,很明显,有嵌套的推动动画,但这不是正确的方法吗?我检查了Apple的DrillDownSave代码,看起来他们是这样做的.使用init方法而不是viewDidLoad方法是否重要?

S B*_*S B 118

pushViewController以前打电话viewDidAppear是不安全的.

  • 如果你在辅助线程上调用pushViewController也会发生. (2认同)

小智 93

偶然触发相同的两次 一次进入代码,一次来自界面构建器,但同时...

我得到了和你们其他人一样的错误.只有我的问题是我偶然发射了两次相同的赛格.一次来自界面构建器,一次来自我的代码.

我有一个UITableView.选择单元格后,界面构建器中的segue将触发.继承了我的问题,我将segue设置为直接点击CELL ITSELf,在界面构建器中,然后在我的代码中,我在didSelectRowAtIndexPath下,代码将触发相同的segue ...就像这样......

[self performSegueWithIdentifier:@"MySegue" sender:tableView];
Run Code Online (Sandbox Code Playgroud)

这意味着当选择了一行来调用didSelectRowAtIndexPath时,它会使用上面的代码行触发segue.然后接口构建器也会触发segue,因为它直接连接到接口构建器中的单元对象.阻止界面构建器直接触发segue.你必须从视图控制器的顶部连接segue,而不是嵌套在从单元本身出来的内部.

因此,如果您出于与我相同的原因遇到此问题,也就是说,您正在调用两次相同的segue,您可以通过将连接从CELL直接链接到您的segue并将segue连接源于IB中表层次结构的顶部,而不是嵌套在单元格内部.将视图控制器本身的segue连接到segue.如果你做得正确,当你选择segue时,它应该突出显示它来自的整个视图,而不仅仅是单元格.

现在,Apples文档在performSegueWithIdentifier:sender:reference下声明:

应用程序通常不需要直接触发segue.而是在Interface Builder中配置与视图控制器关联的对象(例如嵌入在其视图层次结构中的控件)以触发segue.但是,您可以调用此方法以编程方式触发segue,可能是为了响应无法在storyboard资源文件中指定的某些操作.例如,您可以从用于处理抖动或加速度计事件的自定义操作处理程序中调用它.

在我的例子中,我有一个UITableView的搜索按钮,以及当搜索结果表存在时是否调用segue,或者是否存在普通的表视图,必须确定.所以我需要直接触发segue.

因此,从界面构建器中删除嵌入式控件,只需将其粘贴在视图控制器本身上,然后在代码中触发segue!

现在,没有更多的双重!没有更多的错误.

希望有所帮助,花了我几个小时来解决这个问题.

  • 你先生,是一个救生员. (10认同)

cod*_*007 12

我有与你刚才做的相同的问题/错误信息,正在寻找一个解决方案,并最终在这个线程,但是,对我来说,我发现解决方案实际上只有一个动画:是做嵌套推动时(是的)把动画:YES仅用于最终推送),希望这会有所帮助

干杯.


jos*_*lat 10

我已经明白了.显然,如果从UITableViewDelegate的-didSelectRowAtIndexPath方法之外调用-pushViewController,它就不起作用.将呼叫转移到该功能有效.奇怪的.

  • 这解决了这个问题,因为在视图完成动画之后才能调用didSelectRowAtIndexPath.如果您只是确保在viewDidAppear中调用pushViewController:或更高版本,iOS将不会抱怨嵌套的pushViewController调用. (20认同)

Tig*_*ing 8

我发生了同样的问题,因为笔尖中的按钮连接到两个不同的动作.它尝试加载两个视图控制器,从而破坏堆栈.

  • 我也有类似的问题.在我的情况下,我有故事板segues和编程segues(performSegueWithIdentifier)的混合.当我意外地同时做两件事时,我收到了这个错误. (3认同)
  • 这也是我的问题.我有静态表格单元格"推"到下一个控制器.我在didSelectRowAtIndexPath中也有一个performSegueWithIdentifier.两个都被调用导致此消息. (2认同)