提问者:小点点

如何在Swift中删除除一个外的所有视图控制器并弹出到指定的视图控制器?


我有一组视图和一个注销按钮,它将用户注销并将他们带到第一个视图控制器(一个登录/注册屏幕)。我试着用模态表示来做这件事,但它破坏了我的导航,而且我不能使用pop到根视图控制器,因为它不是根视图控制器--我至少有2个导航控制器的深度。我怎么可能只显示第一个呢?我基本上需要它的行为,就好像应用程序刚刚重新启动。解开塞格会有什么帮助吗?谢谢


共2个答案

匿名用户

假设使用UINavigationController,则可以将UINavigationController.setViewControllers(_:Animated:)方法与UINavigationController.ViewControllers结合使用。后者为您提供视图控制器的数组,其排列顺序与导航控制器的排列顺序完全一致,而前者可用于更改导航堆栈。例如,如果希望只保留导航堆栈中的前3个视图控制器:

guard let navigationController = self.navigationController else { return }
let viewControllersToKeep = navigationController.viewControllers.prefix(3)
navigationController.setViewControllers(viewControllersToKeep, animated: true)

注意:导航控制器在这种情况下执行的动画通常是(我相信总是,但不是100%确定)推送动画,而不是弹出,这可能不是想要的。

因此,如果你想让导航控制器执行一个弹出动画,那么你应该调用弹出,直到你到达想要的视图控制器,但关键是动画一个弹出。对于与上面相同的示例:

guard let navigationController = self.navigationController else { return }
let numberOfPops = navigationController.viewControllers.count - 3
for i in 0..<numberOfPops {
    let animated = i == 0
    navigationController.popViewController(animated: animated)
}

希望这回答了关于弹出到所需视图控制器的问题(您可以通过它的类型检测您的视图控制器,然后您可以找出它的索引并使用上面的逻辑)。

如果您想要解除到第一个呈现的视图控制器,那么您需要在第一个呈现的视图控制器上调用UIViewController.dismiss(animated:complety:)dismiss方法的行为如下:

  1. 如果视图控制器呈现一个视图控制器,则它将取消呈现的视图控制器;
  2. 如果视图控制器没有呈现任何视图控制器,但它由另一个视图控制器(即具有父视图控制器)呈现,则它将请求父视图控制器将其取消;
  3. 如果不符合上述条件,则不执行任何操作。

所以长话短说,您需要在视图控制器上调用Dissist以使您希望留在屏幕上。

匿名用户

我基本上需要它的行为,就好像应用程序刚刚重新启动。

在这种情况下,将登录/注册屏幕控制器分配给uiwindow.rootviewcontroller似乎是正确的选项。这里已经介绍了这个主题:Swift ios设置一个新的根视图控制器