iOS 7: UINavigationController 中的 UINavigationBar 不同步

7
我有以下代码:

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
2个回答

9
导航栏有自己的“items”堆栈,该堆栈直到viewDidAppear被调用才会更新。这意味着,如果我们在viewDidLoad中使用setViewControllers:重新创建导航控制器的堆栈,当我们到达viewDidAppear时,当前项目将被添加到条的 “items”堆栈中,因此UINavController视图控制器堆栈将与UINavBar项堆栈不同步。这似乎是iOS 7的一个错误。在iOS 6.0中,无论我们在哪里设置新的viewControllers堆栈,这两个不同的堆栈都不会失去同步。

因此,请尝试将代码移到viewDidAppear中,看看是否可以解决问题。我打赌它会,因为对我来说确实有效。


同样在iOS 9.2.1中看到了这个问题。如果有人感兴趣,这里有一个最小化的可重现示例 - http://pastebin.com/Ef8Z6yWW - Anurag

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;

如果有任何问题,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接