如何打开新的 ViewController 关闭启动它的 iOS Swift
How do I open new ViewController closing the one launching it iOS Swift
我一直在搜索和阅读许多 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)
})
我的问题是登录 VC 可以正常关闭但不会打开主页 VC 因为 self.presentingViewController 为零。
如有任何帮助,我们将不胜感激,
您需要在关闭 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)
})
已经给出的答案很好;我只想在这里详细说明问题的性质。
问题是我们有一个只想使用一次的登录屏幕。当它通过后,我们要进入一个基本屏幕,从现在开始,当应用程序启动时,我们总是从基本屏幕开始。
从登录屏幕或基本屏幕启动的问题,我留给一边。让我们谈谈在使用登录屏幕时,登录屏幕和基本屏幕应该如何关联。我可以想到三种方法:
从登录屏幕显示基本屏幕而不关闭登录屏幕。我知道这听起来很疯狂,但为什么不呢?只显示基本屏幕,让用户无法返回登录屏幕。基本屏幕现在覆盖了整个界面,我们可以继续正常使用该应用程序。'
把整个接口拆掉换掉。很多人这样做:您只需将 window 的根视图控制器更改为基本屏幕。不过我不喜欢这个。
从用户从未实际交互过的父视图控制器开始。登录屏幕是该父级的子级。使用任何所需的转换将登录屏幕替换为基本屏幕。这是我真正喜欢的解决方案。
我一直在搜索和阅读许多 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)
})
我的问题是登录 VC 可以正常关闭但不会打开主页 VC 因为 self.presentingViewController 为零。
如有任何帮助,我们将不胜感激,
您需要在关闭 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
上显示新的 viewControllerself.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)
})
已经给出的答案很好;我只想在这里详细说明问题的性质。
问题是我们有一个只想使用一次的登录屏幕。当它通过后,我们要进入一个基本屏幕,从现在开始,当应用程序启动时,我们总是从基本屏幕开始。
从登录屏幕或基本屏幕启动的问题,我留给一边。让我们谈谈在使用登录屏幕时,登录屏幕和基本屏幕应该如何关联。我可以想到三种方法:
从登录屏幕显示基本屏幕而不关闭登录屏幕。我知道这听起来很疯狂,但为什么不呢?只显示基本屏幕,让用户无法返回登录屏幕。基本屏幕现在覆盖了整个界面,我们可以继续正常使用该应用程序。'
把整个接口拆掉换掉。很多人这样做:您只需将 window 的根视图控制器更改为基本屏幕。不过我不喜欢这个。
从用户从未实际交互过的父视图控制器开始。登录屏幕是该父级的子级。使用任何所需的转换将登录屏幕替换为基本屏幕。这是我真正喜欢的解决方案。