我有这个视图控制器

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中。

然后我单击按钮,然后再次打开应用程序,但是问题是,当我打开应用程序agian时,即使我在viewWillAppearif部分中进行打印,我也不会打赌else发出任何消息。

最佳答案

tylersimko是正确的,即当应用程序进入前台时未调用viewWillAppear(_:),而是由“应用程序进入背景”捕获了该事件。

就是说,您无需从应用程序委托观察到此情况,而可以使用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)
}

上面的代码:
  • 在加载视图时,只要应用程序进入前台,视图控制器就会注册以调用applicationDidEnterForeground()函数。
  • 函数applicationDidEnterForeground()完成所有需要做的事情。
  • 视图控制器在取消分配时会从所有通知中取消注册,以避免9.0之前的iOS版本中的僵尸引用。

  • 鉴于您正在使用NSUserDefaults,可以改为考虑观察NSUserDefaultsDidChangeNotification

    10-07 16:33
    查看更多