【问题标题】:Clearing back stack on transition在过渡时清除回栈
【发布时间】:2013-07-28 06:17:07
【问题描述】:

我有一个使用模态转换设置的故事板,如下所示:

根 -> A -> B -> C

当我从 B 转换到 C 时,我想清除后台堆栈,因为用户将永远无法返回 A、B 或 root。我知道不可能删除根视图控制器,但是有没有办法在转换到 C 时从堆栈中删除 A 和 B。

我有 Android 背景,在开始下一个活动之前,只需在意图中添加 CLEAR_TOP 和 NEW_TASK 标志即可完成。 iOS 中是否有类似的东西?

我试图在从 B->C 转换时调用它,但它会使应用程序崩溃。

[self dismissViewControllerAnimated:NO completion:nil];

Load of B 也试过这个,但它不起作用。

[self.presentingViewController dismissViewControllerAnimated:NO completion:nil];

编辑:是否可以使 C 成为根并清除 A->B 和以前的根。你会怎么做?

【问题讨论】:

  • 也许您可以使用UINavigationController 来实现您想要的。 B->C之后,清空控制器堆栈即可。
  • 使用模态的主要原因是因为我想使用“水平翻转”过渡。我不知道如何用 push 来做这个动画。

标签: ios back-stack


【解决方案1】:

你所要做的就是在 C 的 viewDidAppear 方法中将自己设置为窗口的根视图控制器。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.view.window.rootViewController = self;
}

执行此操作时,根、A 和 B 将被释放。

【讨论】:

  • 感谢您提及释放部分。我以为我会通过更改 root 来创建内存泄漏(即之前的视图仍然会浮动)。
【解决方案2】:

也许你可以使用 UINavigationController 来实现你想要的。 B->C之后,清空控制器堆栈即可。 您可以像这样自定义UINavigationController 的过渡样式:

CATransition *animation = [CATransition animation];
[animation setDuration:0.3];
[animation setType: kCATransitionMoveIn];
[animation setSubtype: kCATransitionFromTop];
[animation setTimingFunction:[CAMediaTimingFunction   functionWithName:kCAMediaTimingFunctionDefault]];

[nav pushViewController:yourViewController animated:NO];

[nav.view.layer addAnimation:animation forKey:nil];

【讨论】:

  • 我从未使用过故事板。我认为您应该将 Next 按钮链接到一个操作方法,您可以在其中 1)分配和初始化您的第二个视图控制器,以及 2)使用代码 sn-p 将其推送到 UINavigationController。
  • 请注意,您可以使用setViewControllers:animated: 方法而不是pushViewController:animated: 将root、A 和B 替换为C,并以这种方式对其进行动画处理。
  • > 只需清除控制器堆栈
【解决方案3】:

你试过-removeFromSuperview

【讨论】:

  • 你指的是[self removeFromParentViewController] 这个我试过了,不行。之前的视图,在这种情况下,B 仍然存在。
【解决方案4】:

您可以使用的一种方法是:

root-> A -> B -> C -> (fakeRoot) => (real root)

在离开root之前,可以创建root的快照(like this

然后,您可以使用您花哨的模态转换来转换到“假根”,但将真正的根放在它后面,以您想要前进的控制器类型。然后只需删除假根以暴露真实根。

  • 制作一个名为“fakeRoot”的 viewController 控制器,它只是一个填满屏幕的大 imageView
  • 将 imageView 设置为您使用上面的快照创建的“根”图像。
  • 对这个 imageView 进行模态转换
  • 在没有动画的情况下弹出到导航控制器的根目录(这应该会显示根目录,但您不会注意到,因为您的模态呈现的视图看起来就像它一样)

【讨论】:

  • 我很难理解你所说的话。你能否详细说明一下。另请参阅编辑。我仍然更喜欢使用模态转换,但如果这是处理后退堆栈的最佳方式,我可以进行推送。
猜你喜欢
  • 1970-01-01
  • 2012-05-24
  • 2020-01-14
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 2013-08-16
相关资源
最近更新 更多