【问题标题】:How to dismiss all but one view controllers and pop to specified view controller in Swift?如何在 Swift 中关闭除一个视图控制器之外的所有视图控制器并弹出到指定的视图控制器?
【发布时间】:2021-06-24 16:39:28
【问题描述】:

我有一堆视图,然后是一个注销按钮,它将用户注销并将他们带到第一个视图控制器(登录/注册屏幕)。我尝试使用模态演示来执行此操作,但它破坏了我的导航,并且我不能使用弹出到根视图控制器,因为它不是根视图控制器 - 我至少有 2 个导航控制器深。我将如何以某种方式只显示第一个?我基本上需要它来表现得好像应用程序刚刚重新启动一样。 unwind segues 会在某种程度上有所帮助吗?谢谢this is what I mean by messing up the navigation. The following view controllers now pop up, instead of(下图是第一次启动应用的实际照片)how it should look

【问题讨论】:

    标签: ios swift storyboard


    【解决方案1】:

    假设您使用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% 肯定)是推送动画而不是弹出动画,这可能不是我们想要的。

    所以如果你想让导航控制器执行一个弹出动画,那么你应该调用 pop 直到你到达所需的视图控制器,但关键是动画单个弹出。同上例:

    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:completion:)dismiss 方法的行为如下:

    1. 如果视图控制器正在呈现视图控制器,那么它将关闭呈现的视图控制器;
    2. 如果视图控制器没有呈现任何视图控制器,而是由另一个视图控制器呈现(即有一个父视图控制器),那么它将要求父视图控制器关闭它;
    3. 如果以上都不是,它将什么都不做。

    长话短说,您需要在要留在屏幕上的视图控制器上调用dismiss。

    【讨论】:

      【解决方案2】:

      我基本上需要它来表现得就像应用刚刚重新启动一样。

      在这种情况下,将登录/注册屏幕控制器分配给UIWindow.rootViewController 似乎是正确的选择。这个话题已经在这里讨论过:Swift ios set a new root view controller

      【讨论】:

      • 这行得通,但它仍然会弄乱导航,我在帖子中添加了截图来解释我的意思。
      猜你喜欢
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多