应用启动时无法从didFinishLaunchingWithOptions访问viewcontroller

时间:2019-01-05 23:50:20

标签: ios swift uiviewcontroller appdelegate

我遇到一个问题,当我从didFinishLaunchingWithOptions中被杀死的应用中吃午餐时,无法访问viewcontroller.swft文件中的功能。

我正在尝试使用viewController?.loadRequestnotificationwaiting(for: url as! String)从AppDelegate访问该函数,该函数将数据传递给ViewController,在那里我可以做一些事情。但是,当我在视图控制器loadRequestnotificationwaiting中的函数中放置警报时。数据未传递。

现在,我在其他区域使用相同的方法将数据从appdelegate传递到viewcontroller,它们可以正常工作。在didFinishLaunchingWithOptions

中使用它似乎不起作用

尝试从didFinishLaunchingWithOptions访问视图控制器时,它是否仍然不可用?

AppDelegate.swift

class AppDelegate : UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    weak var viewController : ViewController?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        ConnectionManager.sharedInstance.observeReachability()
        // Override point for customization after application launch.
        FirebaseApp.configure()
        registerForPushNotifications()

        // opened from a push notification when the app is closed
        if let userInfo = launchOptions?[.remoteNotification] as? [String : AnyObject] {
            if let object = userInfo["aps"] {
                let url = object["url"]

                viewController?.loadRequestnotificationwaiting(for: url as! String)
            }
        }
        return true
    }

}

ViewController.swift

class ViewController: UIViewController, WKNavigationDelegate {
    func loadRequestnotificationwaiting(for notification_url_wait : String) {
        notification_url_final_wait = notification_url_wait

        let url = URL(string: notification_url_final_wait!)
        let URLrequest = URLRequest(url: url!)
        self.webView.load(URLrequest)
    }
}

2 个答案:

答案 0 :(得分:1)

您依赖于AppDelegate的{​​{1}}属性,但是正在视图控制器的viewController方法中设置此属性;由于已经设置了viewDidLoad属性,因此当您的应用已在运行时收到通知时,这很好。

当通知导致您的应用程序启动时,viewController属性未设置 并且未调用该函数。

假设所需的视图控制器是情节提要中的初始视图控制器,则可以从应用程序委托的viewController属性中获取根视图控制器;

window

答案 1 :(得分:0)

  1. 如果您的视图控制器是root用户,则可以通过调用UIApplication.shared.keyWindow!.rootViewController!来召唤它,也可以用viewController覆盖它
  2. 您可以使用-[NotificationCenter postNotificationName:object:userInfo:]发出通知,并在View Controller中观察该通知名称