簡體   English   中英

從AppDelegate調用ViewController的成員函數

[英]calling ViewController's member function from AppDelegate

我想在AppDelegateapplicationWillResignActive函數中調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM