我有一组视图和一个注销按钮,它将用户注销并将他们带到第一个视图控制器(一个登录/注册屏幕)。我试着用模态表示来做这件事,但它破坏了我的导航,而且我不能使用pop到根视图控制器,因为它不是根视图控制器--我至少有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
方法的行为如下:
所以长话短说,您需要在视图控制器上调用Dissist以使您希望留在屏幕上。
我基本上需要它的行为,就好像应用程序刚刚重新启动。
在这种情况下,将登录/注册屏幕控制器分配给uiwindow.rootviewcontroller
似乎是正确的选项。这里已经介绍了这个主题:Swift ios设置一个新的根视图控制器