【问题标题】:Swift Present View Controller From Another View ControllerSwift 从另一个视图控制器呈现视图控制器
【发布时间】:2017-05-17 00:27:01
【问题描述】:

我目前在我的主视图控制器(视图控制器 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

【问题讨论】:

标签: ios swift uiviewcontroller presentviewcontroller


【解决方案1】:

您已经展示了一个 View Controller,并希望从展示的 View Controller 中展示第二个 View Controller,为此您必须调用它:

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

【讨论】:

    【解决方案2】:

    您需要获取当前在应用程序中可见的 top viewController 才能获取 top 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
        }
    }
    

    【讨论】:

    • 您可以创建一个新的类名 UIApplication+Extension 并将代码放入其中。您可以在整个应用程序中调用该方法。例如。 UIApplication.topView()
    • 这个答案能有效解决您的问题吗?
    • 我还没有机会测试这个。我一直在使用 (stackoverflow.com/questions/26667009/…) 接受的答案。我计划很快对此进行测试,如果它有效,我一定会投票并接受,因为它似乎比我现在使用的其他解决方案更好。
    猜你喜欢
    • 2015-06-17
    • 2017-02-03
    • 1970-01-01
    • 2019-09-11
    • 2014-12-12
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多