2011-04-02 38 views
69

我不断收到以下错误:iPhone UINavigation问题 - 嵌套推动画可以导致损坏的导航栏

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]; 

所以啊,很明显,有嵌套推动画,但是这不就是去了解它的正确方法?我检查了Apple的DrillDownSave代码,这似乎是他们如何做的。我使用init方法而不是viewDidLoad方法是否重要?

回答

10

我已经想通了。显然,如果您从UITableViewDelegate的-didSelectRowAtIndexPath方法的外部调用-pushViewController,则它不起作用。将呼叫转入该功能。奇怪的。

+20

这可以解决问题,因为只有在视图完成动画之后才能调用didSelectRowAtIndexPath。如果您只是确保在viewDidAppear:或更高版本中调用您的pushViewController,则iOS不会抱怨嵌套的pushViewController调用。 – 2011-05-30 02:58:09

+0

我真的不明白“显然,如果您从UITableViewDelegate的-didSelectRowAtIndexPath方法的外部调用-pushViewController,它不起作用。”它在我的项目中起作用。 – 2015-12-30 08:02:22

4

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

如果你推一个新的视图控制器推旧有坏的机会之前,必须付诸行动,你会得到这种错误。因此,将某些代码放入init并过早执行可能会导致您报告错误。

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

+1

我对他说我用的init在viewDidLoad中或的loadView唯一原因是因为苹果的示例应用程序不使用init方法来设置,所以我想也许这可能是它的一部分的意见。另外,即使在我将init方法中的所有代码注释掉之后,我仍然会遇到这个问题。为什么SingleEventViewController也不会发生这种情况,但是,如果是这样的话? – joshholat 2011-04-03 03:48:26

+0

你不用init来设置你的用户界面/视图项目 - 这不是通常的地方。仔细看看UIViewController文档。视图可以从笔尖加载。或者你可以在loadView中以编程方式执行它。或者您可以通过笔尖设置基本视图,然后以编程方式在viewDidLoad中添加更多项目。但是你不应该在init中做这样的事情。 – occulus 2011-04-03 19:54:15

+0

我以编程方式进行。所以我应该分配内存并设置loadView中的所有属性,然后将这些内容添加到init中的视图中?因为如果我尝试去做[self.view addSubview:myTableView];在loadView方法中,它崩溃。 – joshholat 2011-04-07 15:36:09

0

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

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

2)仅仅因为你提到viewDidLoad - 这种方法用于初始化的视图加载之后。如果您使用代码创建UIViewController,那么您应该使用loadView来设置子视图。

+0

initWithCoordinates方法不带参数。我计划添加它们,但之后首先遇到了这个问题,并在继续前尝试调试它。但是,为什么SingleEventViewController不是这种情况呢?它需要在init必须设置的参数。并且,谢谢,我会尝试使用loadView。 – joshholat 2011-04-03 03:37:50

11

我有同样的问题/错误消息,因为你没有刚才一直在寻找一个解决方案,结束了在这个线程,但是,对我来说我发现只有一个动画的解决方案实际上有:是做一个时嵌套推(我把动画:是只为最后一推),希望这可以帮助

欢呼声。

+0

您的评论让我解决了这个难题 - 请参阅下面对我接受的答案的评论,它可能会在未来帮助您。 – 2011-05-30 02:59:01

+0

我没有收到错误消息,但第一个视图的导航栏在从第三个视图弹出后显示了中间视图的导航栏。不从顶部设置流行音乐解决了问题。 – Bill 2011-09-05 22:14:11

+0

谢谢,当你提到它的时候,这很有意义。我用动画推动了初始控制器:YES然后是动画:NO-ily推动其余部分让用户到达正确的位置。 – Kalle 2012-03-24 17:58:58

115

调用pushViewControllerviewDidAppear之前是不安全的。

+14

这是正确的答案。 – 2012-07-23 04:21:33

+1

当然这是对问题的解释 – daniherculano 2013-04-22 07:03:57

+2

如果您在辅助线程上调用pushViewController,也会发生这种情况。 – 2013-05-07 17:24:27

8

我遇到了同样的问题,这是由于笔尖中的按钮连接到两个不同的动作导致的。它试图加载两个视图控制器,从而破坏堆栈。

+3

我也有类似的问题。在我的情况下,我有故事板赛段和节目赛段(performSegueWithIdentifier)的混合。当我意外地同时做了这两件事情时,我得到了这个错误。 – Symmetric 2012-03-18 17:23:12

+2

这也是我的问题。我有静态表格单元“推”到下一个控制器。我在didSelectRowAtIndexPath中也有一个performSegueWithIdentifier。都被称为导致这个消息。 – ekawas 2012-07-11 16:32:22

+0

我的答案几乎就是这个答案中所描述的问题,只有在IB中我以某种方式对同一个按钮有两个相同的操作。我确信这是因为我在IB中使用了复制和粘贴。小心。 – Alyoshak 2013-06-06 15:06:38

1

这已被回答,但我认为这可能会帮助其他人,因为我得到了同样的错误,但没有使用表视图。我终于弄清楚了这个问题。

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

93

意外从Interface Builder的两次 一旦引发相同SEGUE在代码中,有一次,但两者在同一时间...

我居然也得到了同样的错误你休息。只有我的问题是我无意中发射了两次相同的赛格。一次来自界面构建器,一次来自我的代码。

我有一个UITableView。当选中一个单元格时,界面构建器中的一个segue会触发。我的继承人问题,我有SEGUE设立直接发射了一下电池本身,界面生成器中,然后在我的代码,我有didSelectRowAtIndexPath方法下,代码,将大火,同样赛格瑞......像这样......

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

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

所以,如果你有这个问题出于同样的原因是我的,那就是,您呼叫的同一SEGUE两次,你可以通过取消链接从小区的连接直接到你的SEGUE,并具有SEGUE解决这个问题连接始于IB中表层次结构的顶部,而不是嵌套在单元格内。从你的View Controller连接Segue到segue。如果你已经做到了这一点,那么当你选择了segue时,它应该突出显示它来自的整个视图,而不仅仅是单元格。

现在苹果文档performSegueWithIdentifier下这样规定:寄件人:参考:

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

在我的情况,我有一个搜索按钮为我的UITableView,以及是否在搜索结果表存在于SEGUE被调用,或正常表视图存在时,必须确定。所以我需要直接触发segue。

因此删除界面生成器的嵌入式控制,只是坚持它的视图控制器本身上,然后触发SEGUE在你的代码!

现在,没有更多的双节!并没有更多的错误。

希望帮助,我花了好几个小时来解决这一个。

+1

我的问题也是由两次触发造成的按钮 – lomec 2013-03-06 07:46:00

+10

您好,先生,是救命的人。 – geekchic 2013-08-13 12:43:46

+1

我有设置一个赛格瑞的'UICellView'在IB,然后我实现的代码通过'self.storyboard'创建一个新的VC和传递我的数据到VC,然后通过'[self.navigationController pushViewController推:VC动画:YES];'。我的解决方案是删除IB中的segue。 – 2014-03-02 07:49:36

0

我的解决办法是

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

1

遇到同样的问题。在我的情况下,我错过了switch语句中的一个中断,因此两个segues同时被触发。轻松解决我的问题。

0

这是因为我的UIControlEvents

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

我不得不改变UIControlEventAllTouchEventsUIControlEventTouchUpInside或但是你想你的按钮,如果你有,因为一个UIButton电话的问题发生的工作对我来说。

2

恩我有这个问题,并且我是新的iOS开发场景。但在接口构建器中查看我的连接检查器(使用文件的所有者)之后,我看到由于我复制了一个按钮,因此它已经为其分配了以前的按钮方法以及我创建的新方法。我想这就是我的问题的嵌套方面来自哪里,因为它正在执行两种不同的方法,这两种方法都将视图推送到导航控制器上。我知道这已经得到了回答,但我想我会把它放在一起,以防其他人像我一样犯了一个愚蠢的错误。

1

我的问题与键盘处于活动状态有关。

-(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栈。

0

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

在我的情况的问题是,当我用推移动到另一个观点, 我还使用

[self.navigationController popViewControllerAnimated:YES]; 

在当前视图的ViewWillDisappear在同一时间。只要删除它,它工作正常。

由于需求和流量,我使用POP。 的层次为1 - > 2 - > 3

我是在图2和想转移,以查看3.在我遇到这个错误的话。

-1

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

如果你推(或弹出)与动画视图控制器(动画:是)它不完全性右走,如果你这样做的另一个推不好的事情发生或在动画完成之前弹出。

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

- (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] nested push animation can result in corrupted navigation bar 2014-07-03 11:54:25.406 Demo[2840:60b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

只需添加代码文件到您的项目,让您的导航控制器APBaseNavigationController的子类,你会好做。

+0

链接[https://github.com/nexuspod/SafeTransition]不再有效。 – jpros 2015-02-24 02:59:09

1

最近,我遇到了同样的问题。原因是: - 我试图错误地弹出视图控制器两次。您可以通过push和pop视图控制器设置断点

0

在我的情况,我无论是从故事板和编程设置推SEGUE检查这个崩溃。希望这会帮助任何人

0

我有太多这样的错误消息,并且导航栏和导航控制器过渡是怪异。我的设置是嵌入在Tab栏控制器中的一堆导航控制器。问题在于我没有在我的标签栏控制器实现viewDidLoad中拨打super.viewDidLoad()

调用超是值得的文档明确指出,覆盖viewDidLoad中时,你应该做的,我这学到了艰辛的道路。

也许这可以帮助别人!

0

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

我有同样的问题,但它是因为我用了一个信息按钮坏的事件引起的。 我正在使用“UIControlEventAllTouchEvents”,并生成了两次将相同视图推入导航控制器。正确的事件是“UIControlEventTouchUpInside”。我是iOS新手。

-1

刚刚完成了列表,这里是另一个原因,这可能会导致“嵌套推动画可以导致损坏的导航栏”:

我做了一个TabBarController内设置多个NavigationController并设置 故事板Identifiy内将selectedIndex属性。将活动的选项卡移至代码错误消失后。

相关问题