从AppDelegate调用ViewController的成员函数

时间:2017-03-23 10:10:25

标签: ios swift

我想在ViewController的{​​{1}}函数中调用AppDelegate的成员函数。不确定最好的方法是什么。我试过这样做:

applicationWillResignActive

但它似乎不合适。我实际上是创建控制器的新实例,而不是使用已存在的实例。

4 个答案:

答案 0 :(得分:6)

我认为实现目标的最佳方法是将此通知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)
}

答案 1 :(得分:0)

是的,您的上述代码将创建一个新实例。如果要使用现有实例,则需要以某种方式获取对现有实例的引用。

如何获得参考将取决于您如何设置视图控制器。例如,如果您的LandmarkViewController是根视图控制器,则可以通过UIWindow获取它。或者,在创建LandmarkViewController实例时,您可以将对视图控制器的引用传递给应用程序委托。这一切都取决于您的应用程序的设置方式。

答案 2 :(得分:0)

您可以从rootViewController获取LandmarkViewControllerUIWindow是我的理解):

if let rootViewController = self.window?.rootViewController as LandmarkViewController {
    rootViewController.test()

}

答案 3 :(得分:0)

我认为最好的方法是在此课程中添加观察者通知。 有些人认为是这样的:

class LandmarkViewController: ...
{
   ...
   func viewDidLoad()
   {
      ...
      NotificationCenter.default.addObserver(forName: applicationWillResignActive, object: nil, queue: OperationQueue.main) { (notification) in
           ...
      }
   }
}