我遇到一个问题,当我从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)
}
}
答案 0 :(得分:1)
您依赖于AppDelegate
的{{1}}属性,但是正在视图控制器的viewController
方法中设置此属性;由于已经设置了viewDidLoad
属性,因此当您的应用已在运行时收到通知时,这很好。
当通知导致您的应用程序启动时,viewController
属性未设置 并且未调用该函数。
假设所需的视图控制器是情节提要中的初始视图控制器,则可以从应用程序委托的viewController
属性中获取根视图控制器;
window
答案 1 :(得分:0)
UIApplication.shared.keyWindow!.rootViewController!
来召唤它,也可以用viewController
覆盖它-[NotificationCenter postNotificationName:object:userInfo:]
发出通知,并在View Controller中观察该通知名称