我想在ViewController
的{{1}}函数中调用AppDelegate
的成员函数。不确定最好的方法是什么。我试过这样做:
applicationWillResignActive
但它似乎不合适。我实际上是创建控制器的新实例,而不是使用已存在的实例。
答案 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
获取LandmarkViewController
(UIWindow
是我的理解):
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
...
}
}
}