Swift - 从AppDelegate向View Controller添加子视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift - 从AppDelegate向View Controller添加子视图相关的知识,希望对你有一定的参考价值。

我试图在当前显示的AppDelegate上添加来自UIViewController的子视图,我注意到如果UIViewControllerAppDelegate添加子视图时显示警告消息,则子视图将添加到UIAlertController而不是UIViewController。什么是在UIViewController上显示子视图的最佳方式,而不是当前UIViewController可能显示的任何其他子视图?这是我目前的代码。

@objc func showStudentLeftTheTestAlert(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        if let visibleVc = self.window?.visibleViewController {
            // do some other stuff here 
            visibleVc.view.addSubview(StudentLeftTestAlertViewController.sharedInstance.view)
        }
    }
}
答案

问题是,警报信息实际上是在你原来的UIViewController上以模态方式呈现的UIViewController。如果你想要到达顶部的shown视图控制器(而不是presented),你可以将这个方法添加到你的AppDelegate。如果您使用的是导航堆栈,它将返回根视图控制器或顶视图控制器。

func getTopViewController() -> UIViewController? {
    let rootViewController = self.window?.rootViewController

    if let navigationController = rootViewController as? UINavigationController {
        // get the top view controller from stack if needed
        return navigationController.topViewController
    } else {
        return rootViewController
    }
}

希望它能帮到你

另一答案

如果您想要显示UIViewController,可以添加以下扩展名:

// MARK: UIApplication extension
extension UIApplication {
    // Get top view controller
    static var topViewController:UIViewController? {
        get{
            if var topController = UIApplication.shared.keyWindow?.rootViewController {
                while let presentedViewController = topController.presentedViewController {
                    topController = presentedViewController
                }
                return topController
            }else{
                return nil
            }
        }
    } 
}

和使用是这样的:

guard let vc = UIApplication.topViewController else { return }

其中vc是您的顶级控制器,可以是UINavigationController,UITabbarcontroller或您的自定义控制器,所有这些都取决于您的导航流程。

以上是关于Swift - 从AppDelegate向View Controller添加子视图的主要内容,如果未能解决你的问题,请参考以下文章

Appdelegate.swift 中的调用函数

从 MainController 向 Delegate 发送消息 - Swift

Swift:从 AppDelegate 中的 UNTextInputNotificationAction 获取内容

从 appdelegate swift 访问 UIwebview

从 AppDelegate 访问 View Controller 的属性

Swift:如何通过快速操作从 AppDelegate 访问某个 TabBar 选项卡?