【问题标题】:iOS8 issue when trying to push multiple UIViewControllers in NavigationController尝试在 NavigationController 中推送多个 UIViewController 时出现 iOS8 问题
【发布时间】: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。

标签: objective-c uiviewcontroller uinavigationcontroller ios8 xcode6


【解决方案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 是的,经过测试。奇迹般有效。你对我帮助很大。爱!
猜你喜欢
  • 2014-09-11
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2016-03-18
  • 2012-03-15
相关资源
最近更新 更多