Swift-обновите значение в RootViewController из AppDelegate, когда приложение переходит в фоновое состояние

У меня есть простое приложение с одним главным видом только.

Я пытаюсь показать обновленное значение времени в метке внутри представления, когда приложение переходит в фоновое состояние.

сценарий:

1-проект приложения с одним видом

2-только один вид (ViewController) с одной меткой для отображения даты

3 - в AppDelegate: applicationWillEnterForeground получить текущее время

func applicationWillEnterForegound(application: UIAPplication){
    var date:String = GetDate()
    --> update View Label with date here
}

4 - показать текущее время на ViewController

Я пытаюсь с делегатами, но проблема в том, что представление было последним видимым элементом в приложении, а методы как viewDidLoad, viewWillAppear вызываются один раз.

3 ответов


как отмечали другие, вы можете использовать структуру уведомлений, чтобы сделать это из вашего контроллера вида, поэтому вашему appDelegate не нужно ссылаться на контроллер вида. Добавьте такую строку в контроллер:

NSNotificationCenter.defaultCenter().addObserver(self,
    selector: #selector(appWillEnterForeground), 
    name: NSNotification.Name.UIApplicationWillEnterForeground,
    object: nil 

в Swift 3 синтаксис немного меняется:

NotificationCenter.default.addObserver(self, 
    selector: #selector(appWillEnterForeground),
    name: NSNotification.Name.UIApplicationWillEnterForeground,
    object: nil)

затем определите функцию, которую вы называете в селекторе:

@objc func appWillEnterForeground() {
   //...
}

Вы можете слушать UIApplicationWillEnterForegroundNotification внутри ViewController. Если вы знаете, что его представления видны, он может найти дату и изменить свою собственную метку.


Спасибо ребята за ответ. Я реализовал теперь уведомление в главном представлении и решить эту проблему.

override func viewDidLoad(){
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.updateDate), name: UIApplicationWillEnterForegroundNotification, object: nil)
}

func updateDate(){
    labelInfo.text = theDate
}

спасибо