在退出应用程序时在UserDefaults中存储标签值(日期)

问题描述 投票:1回答:2

我的目标是存储用户退出应用程序时显示在timeLabel上的日期。再次运行该应用程序时,标签应显示与用户退出该应用程序相同的时间。

我知道我必须以某种方式将timeLabel保存到用户第一次离开应用程序时的默认值。我也不知道是否需要对应用程序委托做任何事情。

import UIKit

class ViewController: UIViewController {
var currentDateTime = Date()
var timeLabel = UILabel()
let defaults = UserDefaults.standard


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

     let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium

    view.addSubview(timeLabel)
    timeLabel.translatesAutoresizingMaskIntoConstraints = false
    timeLabel.backgroundColor = .systemRed
     timeLabel.text = "\(dateFormatter.string(from: currentDateTime))"

    NSLayoutConstraint.activate([

        timeLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 10),
        timeLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
        timeLabel.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.4, constant: 49),
        timeLabel.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.4, constant: 49),



    ])

    defaults.set(timeLabel.text, forKey: "label")
}


}
swift uilabel nsuserdefaults appdelegate
2个回答
0
投票

将侦听器添加到后台回调中并进行设置,您可以在vc内像这样进行操作

NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: .main) { [weak self] notification in 
   defaults.set(Date(), forKey: "lastDate")
}

或在AppDelegate方法内部


0
投票

问题是您没有从UserDefaults加载字符串。因此,请重写您的视图控制器方法viewWillAppear,尝试读取字符串并使用它更新标签。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if let string = defaults.string(forKey: "label") {
        timeLabel.text = string
    }
}

要保存用户离开您的应用程序或进入后台的日期,您可以为iOS12或更早版本使用UIApplication.willResignActiveNotification添加观察者,对于iOS13或更早版本使用UIScene.willDeactivateNotification添加观察者。然后添加选择器以处理停用操作。

因此,在viewDidLoad方法内将观察者添加到视图控制器中:

if #available(iOS 13.0, *) {
    NotificationCenter.default.addObserver(self, selector: #selector(willResignActive), name: UIScene.willDeactivateNotification, object: nil)
} else {
    NotificationCenter.default.addObserver(self, selector: #selector(willResignActive), name: UIApplication.willResignActiveNotification, object: nil)
}

创建您的方法以将字符串保存到UserDefaults。尚不清楚您的意图是在用户每次离开您的应用程序时保存它,还是只想第一次保存它。要在您的应用程序每次进入后台时保存它:

@objc func willResignActive(_ notification: Notification) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .medium
    let string = dateFormatter.string(from: Date())
    defaults.set(string, forKey: "label")
}
© www.soinside.com 2019 - 2024. All rights reserved.