Ответ 1
Если вы хотите быстро вызвать viewWillAppear
, используйте это.
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated) // No need for semicolon
}
У меня есть стандартный проект 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
не вызывается.
Есть ли еще одна функция для переопределения?
Если вы хотите быстро вызвать viewWillAppear
, используйте это.
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated) // No need for semicolon
}
Лучшей практикой является регистрация для 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")
}
Основываясь на ответе Ноя:
на 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
viewDidLoad
вызывается только тогда, когда сначала просматривается представление контроллеров представлений. После этого он остается в памяти, поэтому в общем случае он никогда не будет вызываться снова, пока вы не создадите другой экземпляр контроллера вида. Если вам необходимо обновить контент в контроллере представления, когда приложение входит на передний план, вы должны создать метод для этого и называть его из applicationWillEnterForeground
.
То же, что и @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")
}