web-dev-qa-db-fra.com

Swift - func viewWillAppear

J'ai un projet standard 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");
    }
}

Quand je lance l'application, viewDidLoad est appelé.

Mon scénario:
- appuyez sur le bouton Accueil (applicationDidEnterBackground)
- application de rappel (applicationWillEnterForeground)
et viewDidLoad n'est pas appelé.

Y a-t-il une autre fonction à remplacer?

15
Cristian C.

Si vous voulez appeler viewWillAppear dans Swift, utilisez ceci. 

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

La meilleure pratique consiste à enregistrer UIApplicationWillEnterForegroundNotification et UIApplicationWillEnterBackgroundNotification dans votre 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")
}
6
Sunkas

Basé sur la réponse de Noé:
sur ViewController.Swift ajoute une fonction d'actualisation et l'appelle depuis 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();
}

Sortie: 

viewDidLoad  
refresh  
refresh  
refresh  
refresh  
5
Cristian C.

viewDidLoad n’est appelé que lorsque la vue de votre contrôleur de vue est chargée pour la première fois. Elle reste ensuite en mémoire. Par conséquent, elle ne sera plus appelée que lorsque vous avez créé une autre instance du contrôleur de vue. Si vous devez actualiser le contenu de votre contrôleur de vue lorsque l'application entre au premier plan, vous devez créer une méthode pour le faire et l'appeler à partir de applicationWillEnterForeground.

2
Noah Witherspoon

Identique à @Sunkas mais dans 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")
}
1
massimobio