【问题标题】:How do I open new ViewController closing the one launching it iOS Swift如何打开新的 ViewController 关闭启动它的 iOS Swift
【发布时间】:2021-07-24 17:56:43
【问题描述】:

我一直在搜索和阅读许多 SO 文章,但似乎无法让它发挥作用。

我有一个名为 Startup 的视图控制器,它执行一些 Web 请求等,然后将用户带到登录屏幕。

登录后,我使用此代码尝试在关闭登录视图控制器后打开名为 Home 的内容视图控制器。

self.dismiss(animated: true, completion: {
        let mainStoryboard: UIStoryboard = UIStoryboard(name:"Main",bundle:Bundle.main)
        let secondViewController: Home = mainStoryboard.instantiateViewController(withIdentifier: "home") as! Home
        self.presentingViewController?.present(secondViewController, animated: true, completion: nil)
    })

我的问题是 Login VC 正常关闭,但没有打开 Home VC,因为 self.presentingViewController 为 nil。

任何帮助将不胜感激,

【问题讨论】:

  • 尝试先呈现,然后解散,而不是先解散,然后呈现。
  • 我尝试先展示然后关闭,但这会同时关闭登录和新的 Home VC

标签: ios swift xcode storyboard


【解决方案1】:

已经给出的答案很好;我只想在这里扩展问题的性质。

问题是我们有一个只想使用一次的登录屏幕。当它通过后,我们想进入一个基本屏幕,从现在开始,当应用程序启动时,我们将始终从基本屏幕开始。

从登录屏幕或基本屏幕启动的问题,我留到一边。让我们来谈谈登录屏幕和基本屏幕应该如何关联,当使用登录屏幕时。我可以想到三种方法:

  • 从登录屏幕显示基本屏幕而不关闭登录屏幕。我知道这听起来很疯狂,但为什么不呢?只需呈现基本屏幕并让用户没有办法返回登录屏幕。基本屏幕现在覆盖了整个界面,我们可以继续正常使用该应用程序。'

  • 撕掉整个界面并替换它。很多人这样做:您只需将窗口的根视图控制器更改为基本屏幕。不过我不喜欢这个。

  • 从用户从未真正与之交互的父视图控制器开始。登录屏幕是该父级的子级。使用任何所需的转换将登录屏幕替换为基本屏幕。这才是我真正喜欢的解决方案。

【讨论】:

    【解决方案2】:

    您需要在关闭 viewController 时获取 topViewController。 要获取 topViewController,您可以使用下面的扩展。

    extension UIApplication {
    class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(controller: navigationController.visibleViewController)
        }
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        }
        if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        return controller
    }}
    

    然后你可以在 topViewController 上展示新的 viewController

    self.dismiss(animated: true, completion: {
        let mainStoryboard: UIStoryboard = UIStoryboard(name:"Main",bundle:Bundle.main)
        let secondViewController: Home = mainStoryboard.instantiateViewController(withIdentifier: "home") as! Home
        let topVC = UIApplication.topViewController()
    
        topVC?.present(secondViewController, animated: true, completion: nil)
    })
    

    【讨论】:

    • 非常感谢!完美!
    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多