2013-09-24 129 views
7

我有以下代码:的iOS 7:UINavigationBar的不同步的UINavigationController

NSArray* stack = self.navigationController.viewControllers; 
NSArray* newStack = @[stack[0], stack[2]]; 
[self.navigationController setViewControllers:newStack animated:NO]; 

stack含有3个视图控制器。问题在于导航栏并未移除UINavigationItems以匹配,所以self.navigationController.navigationBar.items.count在运行此代码后仍然返回3。回头让你进入一个奇怪的状态,在那里你可以按下顶部的后退按钮,但它只是消失,不会让你更进一步。

这是iOS 7中的错误还是我只是想做一些非常愚蠢的事情?解决或解决此问题的最佳方法是什么?

+1

任何答案或修复? – nicktmro

回答

0

您描述的行为是一个损坏的导航控制器堆栈。这可能是因为您试图不正确地使用navigationController。我没有太多的代码在这里,但我猜你正试图跳回到你的根视图控制器?我想这可能是更多,你需要什么:

https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instm/UINavigationController/popToRootViewControllerAnimated

然后你会想要的东西添加自定义后退按钮像这样:

UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(yourMethodToPopToRoot)]; 
//yourMethodToPopToRoot is a method you create that runs popToRootViewController 
self.navigationItem.leftBarButtonItem = backButton; 

任何疑问让我知道。

9

navigationBar有自己的'items'堆栈,它在viewDidAppear命中之前不会更新。

这意味着,如果我们即使用setViewControllers堆在viewDidLoad中:当我们到了viewDidAppear我们将目前的项目加入到酒吧的重建导航控制器‘项目的’叠加,因此UINavController的viewController堆栈不会与UINavBar项目堆栈同步。这似乎是一个iOS 7的错误。

在iOS 6.0中,无论我们在哪里设置新的viewControllers堆栈,2个不同的堆栈都不会不同步。

因此,请尝试在viewDidAppear中移动您的代码,看看是否解决了这个问题。我敢打赌,因为对我来说,它确实如此。

+0

也在iOS 9.2.1中看到这一点。如果有人对此感兴趣,这是一个最低限度重现的示例 - http://pastebin.com/Ef8Z6yWW – Anurag

相关问题