iOS 7:UINavigationBar与UINavigationController不同步

ext*_*ine 7 ios ios7

我有以下代码:

NSArray* stack = self.navigationController.viewControllers;
NSArray* newStack = @[stack[0], stack[2]];
[self.navigationController setViewControllers:newStack animated:NO];
Run Code Online (Sandbox Code Playgroud)

stack包含3个视图控制器.问题是导航栏没有删除UINavigationItems以匹配,因此self.navigationController.navigationBar.items.count在运行此代码后仍然返回3.回头让你进入一个奇怪的状态,你可以按下顶部的后退按钮,但它只是消失了,不会再带你回去了.

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

Hor*_*hiv 9

navigationBar有自己的'items'堆栈,直到viewDidAppear命中才会更新.

这意味着,如果我们使用ieViewControllers在viewDidLoad中重新创建导航控制器的堆栈:当我们到达viewDidAppear时,我们将当前项添加到bars''project'堆栈中,因此UINavController viewController堆栈将不会与UINavBar项目堆栈.这似乎是iOS 7的错误.

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

因此,请尝试在viewDidAppear中移动代码,看看是否能解决问题.我打赌它会,因为对我来说它确实如此.


dal*_*iam 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;
Run Code Online (Sandbox Code Playgroud)

有任何问题请告诉我。