在转换时清除堆栈

时间:2013-07-28 06:17:08

标签: ios back-stack

我使用模态转换设置故事板如下:

root - > A - > B - > C

当我从B转换到C时,我想要清除backstack,因为用户永远无法返回A,B或root。我知道删除根视图控制器是不可能的,但有一种方法可以在转换到C时从堆栈中删除A和B.

我有Android背景,在那里可以通过在开始下一个活动之前向意图添加CLEAR_TOP和NEW_TASK标志来完成。在iOS中有类似的东西吗?

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

[self dismissViewControllerAnimated:NO completion:nil];

在视图上尝试了这个加载B但它不起作用。

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

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

4 个答案:

答案 0 :(得分:3)

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

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

执行此操作时,将取消分配Root,A和B.

答案 1 :(得分:1)

也许您可以使用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];

答案 2 :(得分:0)

您是否尝试过-removeFromSuperview

答案 3 :(得分:0)

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

根 - > A - > B - > C - > (fakeRoot)=> (真正的根)

在离开root之前,您可以创建根(like this

的快照

然后,您可以使用您喜欢的模态转换过渡到“假根”,但在您想要前进的控制器类型中放置真正的根。然后删除假根以暴露真实的根。

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