单击主页按钮后未调用viewWillAppear

时间:2015-11-11 23:57:09

标签: ios swift

我有这个视图控制器

class ViewController: UIViewController {


 override func viewWillAppear(animated: Bool) {
        let user = NSUserDefaults()
        let mobileNumber = user.valueForKey("mobileNumber") as? String
        if let mobileNumber = mobileNumber {
            print("mobile number = \(mobileNumber)")
        }else {
            print("no mobile number")
        }
    }


    @IBAction func makePhoneCall(sender: UIButton) {
 if let phoneCall = phoneCall {
            let user = NSUserDefaults()
            user.setValue(phoneCall, forKey: "mobileNumber")

当用户点击按钮时,我将mobileNumber保存在nsuserdefault中。

然后我点击按钮,然后我再次打开应用程序,但问题是,当我打开应用程序时,我不打赌来自viewWillAppear的任何消息,即使我正在打印if以及else部分。

2 个答案:

答案 0 :(得分:3)

tylersimko是正确的,当应用程序进入前台时不会调用viewWillAppear(_:)而该事件被&#34捕获;应用程序将进入后台"。

也就是说,您不需要从应用代表处观察此内容,而是可以使用UIApplicationWillEnterForegroundNotification notification

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "applicationDidEnterForeground", name: UIApplicationWillEnterForegroundNotification, object: nil)
}

func applicationDidEnterForeground() {
    // Update variable here.
}

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

以上代码:

  1. 加载视图时,只要应用程序进入前台,视图控制器就会注册调用函数applicationDidEnterForeground()
  2. 函数applicationDidEnterForeground()执行任何需要完成的任务。
  3. 视图控制器在解除分配时从所有通知中取消注册,以避免在9.0之前的iOS版本中使用僵尸引用。
  4. 鉴于您正在使用NSUserDefaults,您可以考虑观察NSUserDefaultsDidChangeNotification

答案 1 :(得分:2)

在AppDelegate.swift中,在applicationWillEnterForeground中进行更改:

func applicationWillEnterForeground(application: UIApplication) {
    // do something
}

或者,如果您想在ViewController中保留更改,可以设置一个函数并调用它:

func applicationWillEnterForeground(application: UIApplication) {
    ViewController.refreshView()
}