Swift - func viewWillAppear

У меня есть стандартный проект SingleViewApplication.

ViewController.swift

import UIKit
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        println("viewDidLoad");
    }
}

Когда я запускаю приложение, вызывается viewDidLoad.

Мой сценарий:
- нажмите кнопку "Домой" (applicationDidEnterBackground)
- отзыв приложения (applicationWillEnterForeground)
и viewDidLoad не вызывается.

Есть ли еще одна функция для переопределения?

Ответ 1

Если вы хотите быстро вызвать viewWillAppear, используйте это.

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated) // No need for semicolon
}

Ответ 2

Лучшей практикой является регистрация для UIApplicationWillEnterForegroundNotification и UIApplicationWillEnterBackgroundNotification в вашем ViewController

public override func viewDidLoad()
{
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "applicationWillEnterForeground:", name: UIApplicationWillEnterForegroundNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "applicationWillEnterBackground:", name: UIApplicationDidEnterBackgroundNotification, object: nil)
}

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

func applicationWillEnterForeground(notification: NSNotification) {
    println("did enter foreground")
}

func applicationWillEnterBackground(notification: NSNotification) {
    println("did enter background")
}

Ответ 3

Основываясь на ответе Ноя:
на ViewController.swift добавьте функцию обновления и вызовите ее из AppDelegate.swift > applicationWillEnterForeground

ViewController.swift  

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        println("viewDidLoad");
        refresh();
    }

    func refresh(){
        println("refresh");
    }
}

.

AppDelegate.swift
func applicationWillEnterForeground(application: UIApplication!) {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    ViewController().refresh();
}

Выход:

viewDidLoad  
refresh  
refresh  
refresh  
refresh  

Ответ 4

viewDidLoad вызывается только тогда, когда сначала просматривается представление контроллеров представлений. После этого он остается в памяти, поэтому в общем случае он никогда не будет вызываться снова, пока вы не создадите другой экземпляр контроллера вида. Если вам необходимо обновить контент в контроллере представления, когда приложение входит на передний план, вы должны создать метод для этого и называть его из applicationWillEnterForeground.

Ответ 5

То же, что и @Sunkas, но в Swift 4:

open override func viewDidLoad()
{
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterForeground(notification:)), name: .UIApplicationWillEnterForeground, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(applicationDidEnterBackground(notification:)), name: .UIApplicationDidEnterBackground, object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

@objc private func applicationWillEnterForeground(notification: NSNotification) {
    print("will enter foreground")
}

@objc private func applicationDidEnterBackground(notification: NSNotification) {
    print("did enter background")
}