尝试在 NavigationController 中推送多个 UIViewController 时出现 iOS8 问题

Posted

技术标签:

【中文标题】尝试在 NavigationController 中推送多个 UIViewController 时出现 iOS8 问题【英文标题】:iOS8 issue when trying to push multiple UIViewControllers in NavigationController 【发布时间】:2014-10-02 20:53:21 【问题描述】:

我有 6 个 UIViewControllers 与带有标识符的推送 segues 连接,并在我的应用程序中使用此方法“跳转”到所需的 UIViewController 以堆叠 ViewControllers:

- (void) JumpTo6 
UINavigationController *nav = self.navigationController;
UIViewController *a =[self.storyboard instantiateViewControllerWithIdentifier:@"2"];
[nav pushViewController:a animated:NO];
UIViewController *b =[self.storyboard instantiateViewControllerWithIdentifier:@"3"];
[nav pushViewController:b animated:NO];
UIViewController *c =[self.storyboard instantiateViewControllerWithIdentifier:@"4"];
[nav pushViewController:c animated:NO];
UIViewController *d =[self.storyboard instantiateViewControllerWithIdentifier:@"5"];
[nav pushViewController:d animated:NO];
UIViewController *e =[self.storyboard instantiateViewControllerWithIdentifier:@"6"];
[nav pushViewController:e animated:YES];

使用 ios7 时一切正常。我会触发这个方法,假设我在UIViewController 1 上,系统将每隔UIViewController 堆叠一次,直到 UI VC 6,UIViewController 6 会呈现动画。

但是在 iOS8 上出现了奇怪的行为。系统短暂显示UIViewcontroller 5,然后转到UIViewcontroller 6。这是我不想要的。

总结一下:

iOS 7:1 -----> 6 - 可取

iOS 8:1 -----> 5(在短时间内)----> 6 - 不受欢迎

我的问题是如何使用 iOS 8 达到理想的效果。Ty!

【问题讨论】:

为什么要这样做?这不是使用导航控制器的正常方式。如果用户在这种情况下点击后退按钮(从 6 开始),他将返回到 5,这是他以前从未见过的 - 他会期待返回到 1,因为他来自那里。 这正是我想要的。 好吧,希望 Apple 可以接受。我不知道这是否违反了HIG。 【参考方案1】:

使用方法:

- (void)setViewControllers:(NSArray *)viewControllers
              animated:(BOOL)animated

一次设置所有控制器,只显示最后一个。

在你的情况下:

- (void) JumpTo6 
  UINavigationController *nav = self.navigationController;
  UIViewController *a = [self.storyboard instantiateViewControllerWithIdentifier:@"2"];
  UIViewController *b = [self.storyboard instantiateViewControllerWithIdentifier:@"3"];
  UIViewController *c = [self.storyboard instantiateViewControllerWithIdentifier:@"4"];
  UIViewController *d = [self.storyboard instantiateViewControllerWithIdentifier:@"5"];
  UIViewController *e = [self.storyboard instantiateViewControllerWithIdentifier:@"6"];
  NSArray *viewControllers = nav.viewControllers;
  NSArray *newViewControllers = [NSArray arrayWithObjects:a, b, c, d, e, nil];
  [nav setViewControllers:[viewControllers arrayByAddingObjectsFromArray:newViewControllers] animated:YES];

【讨论】:

那很好,但是(void)setViewControllers 方法将用我不能使用的指定项目替换由导航控制器管理的视图控制器。视图控制器必须由导航控制器管理。 @AndrejTrilavov setViewControllers:animated: 将替换 由导航控制器管理的视图控制器。然后导航控制器将管理新设置的视图控制器。这个答案是您问题的正确解决方案,并且会完全按照您的意愿行事。 @PartiallyFinite 是的,你是对的。我很快就得出结论。但是当我尝试实现这个方法时,我得到了No visible @interface for 'NSArray' declares the selector 'arrayByAddingObjectsFromArray:animated:'(最后一行代码)。抱歉,如果我再次遗漏了一些明显的东西。泰!感谢您的帮助。 @PartiallyFinite & Heinz 是的,经过测试。奇迹般有效。你对我帮助很大。爱!

以上是关于尝试在 NavigationController 中推送多个 UIViewController 时出现 iOS8 问题的主要内容,如果未能解决你的问题,请参考以下文章

NavigationController 和 View Hierarchy 问题

无法关闭 NavigationController

IOS8 SplitVC + TabBarController + NavigationController

使用 ECSlidingViewController 在两个 NavigationController 之间转换

navigationController.topViewController 与情节提要

iOS - 在 navigationController 上嵌入 viewController