繁体   English   中英

来自另一个视图控制器的Swift Present View控制器

[英]Swift Present View Controller From Another View Controller

我目前在主视图控制器(View Controller A)中有以下功能。

func myAction() {       
    let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
    let viewControllerC : UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewControllerC") as UIViewController

    self.present(viewControllerC, animated: false, completion: nil)
}

当当前显示View Controller A并调用myAction ,它可以正常工作并显示viewControllerC

但是这个函数myAction基本上可以在任何时候调用。 有时即使View Controller A不是屏幕上的当前视图控制器。 有时,当View Controller B时,仍然会调用此函数。 它被称为罚款。 但在这种情况下它不会加载viewControllerC

我还尝试了以下思路,可以从活动视图控制器中显示。 但这也不起作用。

self.view.window?.rootViewController?.present(viewControllerC, animated: false, completion: nil)

无论当前显示什么视图控制器,如何在调用myAction时显示viewControllerC

您需要获取当前在应用程序中可见的顶级viewController以获取顶级viewController使用此代码

extension UIApplication {
    class func topView(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let navController = controller as? UINavigationController {
            return topViewController(controller: navController.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
    }
}

您已经提供了一个View Controller,并希望从呈现的View Controller中显示第二个View Controller,为此您必须调用:

UIApplication.shared.keyWindow?.rootViewController?.presentedViewController?.present(newViewController, animated: true, completion: nil)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM