iPhone的UINavigation问题 – 嵌套的推动animation可能导致导航栏损坏

我不断收到以下错误:

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. 

这是我正在做的。 从视图控制器,当按下某个button时,我会调用以下命令:

 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中按下某个button,我会调用:

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

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

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

所以,很明显,嵌套的推animation,但这不是正确的方式去呢? 我检查了苹果的DrillDownSave代码,这似乎是他们如何做到这一点。 我使用init方法而不是viewDidLoad方法是否重要?

viewDidAppear之前调用pushViewController是不安全的。

意外地触发相同的分段两次 一旦在代码中,一次从界面生成器,但在同一时间…

和其他人一样,我遇到了同样的错误。 只有我的问题是我意外地发射同样的赛格,两次。 一次从界面生成器,一次从我的代码。

我有一个UITableView。 当一个单元格被选中时,界面构build器中的一个segue会被触发。 inheritance人我的问题,我有设置segue直接点击CELL ITSELF,在界面生成器内,然后在我的代码,我已经在didSelectRowAtIndexPath,代码,将火同样的赛格…像这样…

 [self performSegueWithIdentifier:@"MySegue" sender:tableView]; 

这意味着,当didSelectRowAtIndexPath被调用,因为一个行被选中,它会触发与上面的代码行。 然后界面生成器,也触发segue,因为它直接连接到界面生成器中的单元对象。 停止直接触发segue的接口生成器。 你必须从视图控制器的顶部连接segue,而不是嵌套在单元格本身的内部。

所以如果你遇到这个问题的原因和我一样,也就是说,你两次调用同一个segue,你可以通过将连接从CELL DIRECTLY直接解除连接到你的segue并且让segue连接在IB的表层次结构的顶部,而不是嵌套在单元格内。 从你的视图控制器本身连接到segue。 如果你这样做是正确的,当你selectsegue时,应该突出显示它来自的整个视图,而不仅仅是单元格。

现在,苹果文档状态,因此在performSegueWithIdentifier下:发件人:参考:

应用程序通常不需要直接触发赛格。 而是在与视图控制器相关联的Interface Builder中configuration一个对象,例如embedded其视图层次结构中的控件,以触发segue。 但是,您可以调用此方法以编程方式触发segue,也许可以响应故事板资源文件中无法指定的某些操作。 例如,您可以从用于处理摇晃或加速度计事件的自定义操作处理程序中调用它。

在我的情况下,我有我的UITableView的searchbutton,当search结果表存在或正常表格视图存在时是否调用segue必须确定。 所以我需要直接触发segue。

因此,从界面构build器中删除embedded式控件,并将其粘贴在视图控制器本身上,然后触发代码中的segue!

现在,没有更多的双重赛段! 而没有更多的错误。

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

我有同样的问题/错误消息,你刚刚做了,正在寻找一个解决scheme,并最终在这个线程,但是,我发现解决scheme实际上只有一个animation︰是做一个嵌套的推把animation:是只为最后推),希望这有助于

干杯。

我已经知道了。 显然,如果您从UITableViewDelegate的-didSelectRowAtIndexPath方法的外部调用-pushViewController,则不起作用。 将呼叫转移到该function。 奇怪的。

我遇到了同样的问题,因为一个笔尖的button被连接到两个不同的动作。 它试图加载两个视图控制器,从而破坏堆栈。

当你说你使用init方法而不是viewDidLoad方法时,你是什么意思?

如果您在推送之前推送新的视图控制器的机会不好,您将会遇到这种错误。 因此,将某些代码放入init并过早地执行可能会导致错误被报告。

在视图控制器上运行init的时候,视图还没有被加载!

嗯,我有这个问题,而且我是新的iOS开发场景。 但在接口构build器中查看我的连接检查器(与文件的所有者)后,我看到,因为我已经复制了一个button,它有以前的button方法分配给它,以及我创build的新方法。 我猜这是我的问题的嵌套方面来自,因为它正在执行两种不同的方法,这两种方法都将视图推到导航控制器上。 我知道这已经被回答了,但我想我会把这个,以防万一有人像我一样愚蠢的错误。

这已经得到了答复,但我认为这可能会帮助别人,因为我得到了同样的错误,但没有使用表视图。 我终于明白了这个问题。

我有一个现有的button,其IBAction调用了一个pushViewController。 我通过复制现有的button创build了一个新的button。 新的button也有一个调用pushViewController的动作。 当轻按新button(触摸里面)和视图控制器被推,我得到这个错误。 我删除了新的button,从头开始创build它,将其绑定到现有的sockets和操作,并且错误消失了。

跑到同样的问题。 在我的情况下,我错过了switch语句中的一个中断,所以两个segues同时被解雇了。 很容易修复我。

我的问题与键盘被激活。

这是通过从textField的委托方法推送ViewController导致的:

 -(void)textFieldDidBeginEditing:(UITextField *)textField{ FilterLocationViewController *destViewController = (FilterLocationViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"FilterLocationViewController"]; [self.navigationController pushViewController:destViewController animated:YES]; } 

通过将代码更改为:

 -(void)textFieldDidBeginEditing:(UITextField *)textField{ [_textFieldLocation resignFirstResponder]; //adding this line FilterLocationViewController *destViewController = (FilterLocationViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"FilterLocationViewController"]; [self.navigationController pushViewController:destViewController animated:YES]; } 

(添加行[textField resignFirstResponder]; )问题消失了。

基本上,教训是,如果键盘没有了,你不应该修改navigationController栈。

最近我遇到了同样的问题。 原因是: – 我试图错误地popup视图控制器两次。 您可以通过在推送和popup视图控制器上设置断点来检查此崩溃

1)也许你可以尝试在推送UIViewController之前将必要的variables作为属性传递,而不是使用具有参数的init方法。 无论如何,最有可能你需要这些参数超出你的init方法。

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

2)仅仅因为你提到了viewDidLoad – 这个方法是在视图加载后进行初始化的。 如果你在代码中创buildUIViewController,你应该使用loadView来设置你的子视图。

这是因为我的UIControlEvents而发生的

  [button addTarget:self action:@selector(callSecondView) forControlEvents:UIControlEventAllTouchEvents]; 

我不得不将UIControlEventAllTouchEvents更改为UIControlEventAllTouchEvents ,或者如果由于UIButton调用而导致问题,您希望button正常工作。

我的解决scheme是

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

不知道别人的。 我想大部分使用StoryBoard的人都面临这样的问题。 我正在使用XIB。

在我的情况下,问题是,当我使用推动移动到另一个视图时,我也在使用

  [self.navigationController popViewControllerAnimated:YES]; 

在当前View的ViewWillDisappear中同时出现。 只要删除它,它工作正常。

由于需求和stream量,我使用POP。 层级是1 – > 2 – > 3

我在观点2,并想移动到观看3.在这种情况下,我遇到了这个错误。

在我的情况下,我是从故事板和编程设置推继续。 希望这会帮助任何人

我也有这个错误信息,导航栏和导航控制器转换奇怪。 我的设置是embedded在选项卡栏控制器中的一堆导航控制器。 问题是我没有在我的标签栏viewDidLoad控制器实现中调用super.viewDidLoad()

调用超级是文档清楚地指出,当重写viewDidLoad时应该这样做,而且我很难学会这一点。

也许这可以帮助别人!

我知道这是回答,但它可以帮助别人。

我有同样的问题,但是这是因为我使用了一个错误的信息button事件。 我正在使用“UIControlEventAllTouchEvents”,这产生了两个相同的视图推入导航控制器。 正确的事件是“UIControlEventTouchUpInside”。 我是iOS新手。

这解决了这个问题: https : //github.com/nexuspod/SafeTransition

如果使用animation(animation:YES)推动(或popup)视图控制器,则不会立即完成,如果在animation完成之前再次按下或popup,则会发生不好的事情。

要重现此错误,请尝试同时按下或popup两个视图控制器。 例:

 - (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演示[2840:60b]嵌套的推动animation可能导致导航栏损坏2014-07-03 11:54:25演示[2840:60b]完成导航过渡处于意外状态。 导航栏子视图树可能会损坏。

只需将代码文件添加到您的项目中,并将您的导航控制器作为APBaseNavigationController的一个子类,那么您将很好做。

只是为了完成列表,这是另一个可能导致“嵌套的推动animation可能导致导航栏损坏”的原因:

我在TabBarController中设置了几个NavigationController,并在storyboard Identifiy Properties中设置了selectedIndex。 移动活动的选项卡到代码错误消失。