[英]calling ViewController's member function from AppDelegate
我想在AppDelegate
的applicationWillResignActive
函數中調用ViewController
的成員函數。 不確定什么是最好的方法。 我嘗試這樣做:
let landmark = LandmarkViewController()
landmark.test()
但它似乎不正確。 我實質上是在創建控制器的新實例,而不是使用已經存在的實例。
我認為實現所需目標的最佳方法是將此通知UIApplicationWillResignActiveNotification
的觀察者設置為視圖控制器本身。
override func viewDidLoad() {
super.viewDidLoad()
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appDidResign), name: Notification.Name.UIApplicationWillResignActive, object: nil)
}
func appDidResign() {
// do your stuff
}
deinit {
NotificationCenter.default.removeObserver(self) //always remember to remove any observers (you can do this in deinit in this case)
}
是的,您上面的代碼將創建一個新實例。 如果要使用現有實例,則需要以某種方式獲取對現有實例的引用。
如何獲得參考將取決於您如何設置視圖控制器。 例如,如果LandmarkViewController
是根視圖控制器,則可以通過UIWindow
獲取它。 或者,當您創建LandmarkViewController
實例時,可以將對視圖控制器的引用傳遞給應用程序委托。 這完全取決於您的應用設置方式。
您可以從UIWindow
獲取rootViewController
(您對LandmarkViewController
理解):
if let rootViewController = self.window?.rootViewController as LandmarkViewController {
rootViewController.test()
}
我認為最好的方法是在此類中添加觀察者以進行通知。 有人這樣想:
class LandmarkViewController: ...
{
...
func viewDidLoad()
{
...
NotificationCenter.default.addObserver(forName: applicationWillResignActive, object: nil, queue: OperationQueue.main) { (notification) in
...
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.