web-dev-qa-db-ja.com

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
and viewDidLoadは呼び出されません。

オーバーライドする別の関数はありますか?

17
Cristian C.

SwiftでviewWillAppearを呼び出したい場合はこれを使用してください。

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

ベストプラクティスは、ViewControllerでUIApplicationWillEnterForegroundNotificationおよびUIApplicationWillEnterBackgroundNotificationに登録することです

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

ノアの回答に基づく:
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  
5
Cristian C.

viewDidLoadは、View Controllerのビューが最初にロードされたときにのみ呼び出されます。その後、メモリに残ります。したがって、通常は、View Controllerの別のインスタンスを作成するまで再び呼び出されません。アプリケーションがフォアグラウンドに入ったときにView Controllerのコンテンツを更新する必要がある場合は、それを行うメソッドを作成してapplicationWillEnterForegroundから呼び出す必要があります。

2

@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")
}
1
massimobio