【问题标题】:self.navigationController popToRootViewControllerAnimated:YES do not pop back to the rootself.navigationController popToRootViewControllerAnimated:YES 不弹回根
【发布时间】:2013-10-14 16:54:45
【问题描述】:

当点击顶部栏上的“返回”按钮时,我有这行代码可以弹回根菜单:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController popToRootViewControllerAnimated:YES];
}

我到现在都没有这个问题,我仍然使用IOS 5.1作为目标。

当我现在运行此代码(XCODE 5)时,我收到以下消息:

Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

...它似乎只将顶部栏中的文本弹出回根(菜单),而显示只弹出一个级别。由于这一直有效,我有点困惑,想得到一些如何解决这个问题的建议。我执行这段代码的视图控制器是一个普通的视图控制器。

我使用[self performSegueWithIdentifier:@"xxxxx" sender:self];来推送 ViewControllers。

只是为了测试我使用了这个代码:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.navigationController popToRootViewControllerAnimated:YES];
}

...它确实弹出了 VC,然后直接弹出回 rootVC 没有消息???

这是结构,它来自绿色 VC,我在回到第一个 VC 时遇到问题。同样,我在 xcode5 之前没有遇到过这个问题:

【问题讨论】:

  • 可能viewDidDisappear工作。
  • 尝试在弹出到根视图控制器后调用[super viewWillDisappear:animated];,或者根本不调用它,好像一个转换正在进行中,另一个可能不会启动。
  • 我已经尝试了这两个答案,“viewDidDisappear”会在当时将其弹回一级,而不是直接弹出到根目录。 @Yas Kuraishi 不叫超级,或者之后做,没有区别。奇怪的是它在 Xcode 5 之前确实有效 :-(
  • 您是先使用上一个过渡吗?我的意思是在调用它之前你是弹出还是关闭模态视图控制器?
  • @Lefteris 不,我正在通过 segue 使用“推送”。

标签: objective-c ios5


【解决方案1】:

好的,我刚刚注意到您正在尝试弹出到根目录,当用户推回时,但这是正在发生的事情:

操作系统试图通过动画推送到前一个 viewController,同时,您正在启动第二个转换并要求它弹出到根视图控制器。

最简单的方法是将系统的后退按钮替换为自定义按钮,该按钮将使用您自己的 IBAction,然后您将弹出到 rootViewController:

先隐藏后退按钮:

self.navigationItem.hidesBackButton = YES;

然后创建自己的自定义返回按钮:

UIBarButtonItem *backBtn =[[UIBarButtonItem alloc]initWithTitle:@"back" style:UIBarButtonItemStyleDone target:self action:@selector(popToRoot:)];
self.navigationItem.leftBarButtonItem=backBtn;

最后你弹出到 RootViewController:

- (IBAction)popToRoot:(UIBarButtonItem*)sender {
   [self.navigationController popToRootViewControllerAnimated:YES];
}

记得从ViewWillDisappear 委托中删除[self.navigationController popToRootViewControllerAnimated:YES];

【讨论】:

  • 感谢您的回答,但仍然无法正常工作。我确实在导航栏模块中放置了一个断点,但看起来它从未被调用过。我确实添加了代表。
  • ...但奇怪的是这已经工作了两年。
  • 好的,请看新方法。这应该更容易使用,前一个需要继承 UINavigationController 并且会复杂得多。
  • 除了保留导航项通常使用的后退箭头外,您如何做到这一点?
【解决方案2】:

试试这个代码,它会帮助你..

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

【讨论】:

  • 我测试了一下,放到了“viewWillDisappear”,还是不行,和之前的结果一样。
  • objectAtIndex:0 它导航索引 0 视图控制器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2011-09-23
相关资源
最近更新 更多