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 中的错误还是我只是想做一些非常愚蠢的事情?解决或解决此问题的最佳方法是什么?

4

2 回答 2

9

导航栏有自己的“项目”堆栈,直到 viewDidAppear 命中才会更新。

这意味着,如果我们使用 setViewControllers 在 vi​​ewDidLoad 中重新创建导航控制器的堆栈:当我们到达 viewDidAppear 时,我们会将当前项目添加到栏的“项目”堆栈中,因此 UINavController viewController 堆栈将不会与UINavBar 项目堆栈。这似乎是一个 iOS 7 错误。

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

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

于 2013-11-26T21:34:48.003 回答
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;

任何问题让我知道。

于 2013-09-25T00:04:40.423 回答