Ios NSUserDefaults中的数据仅在重新运行应用程序后刷新

Ios NSUserDefaults中的数据仅在重新运行应用程序后刷新,ios,iphone,swift,Ios,Iphone,Swift,有一个初始场景,viewDidLoad从数据中获取对象并将其属性输出到UITextLabel 至少我还有一个场景包含两个UIExtFields和UIButton。我想更改NSUserDefaults中的数据,并在segue之后在初始场景中查看新数据 if sender as? UIBarButtonItem == saveButton { var defaults = NSUserDefaults.standardUserDefaults() if dis

有一个初始场景,viewDidLoad从数据中获取对象并将其属性输出到UITextLabel

至少我还有一个场景包含两个UIExtFields和UIButton。我想更改NSUserDefaults中的数据,并在segue之后在初始场景中查看新数据

    if sender as? UIBarButtonItem == saveButton {
        var defaults = NSUserDefaults.standardUserDefaults()
        if discriptionField.hasText() {
            newPaymentItem = CPaymentInfo(value: valueField.text.toInt()!, discription: discriptionField.text)
        } else {
            newPaymentItem = CPaymentInfo(value: valueField.text.toInt()!)
        }
        var data: NSData = NSKeyedArchiver.archivedDataWithRootObject(newPaymentItem!)
        defaults.setObject(data, forKey: "testing1")
    }
但当我按下“保存”按钮时,初始场景中的新号码不会出现,只会出现旧号码,但若我重新运行应用程序,新号码会出现

据我所知,viewDidLoad可能不会在segue之后启动。Ofc我可以在初始场景的展开方法中设置这样的文本标签

    var sourse: AddPaymentViewController = segue.sourceViewController as! AddPaymentViewController
    var newItem: CPaymentInfo? = sourse.newPaymentItem
    if let new = newItem {
        self.testLabel.text = "\(new.paymentValue)"
        var defaults = NSUserDefaults.standardUserDefaults()
        var data: NSData = NSKeyedArchiver.archivedDataWithRootObject(new)
        defaults.setObject(data, forKey: "testing1")
    }
但是有没有一种更优雅、更合理的方法来设置testLabel.text?

是的,在展开段之后不会调用viewDidLoad。
可以在ViewWillAppeard方法或“展开”序列中刷新UI。

问题在于您没有同步保存的数据。必须调用default.synchronize方法才能将更改写入存储


我尝试使用ViewWillDisplay,但新号码仅在大约0.5秒后才会随着旧号码的更改而显示。您是否正在执行默认值。同步?您以后必须使用同步。
    var sourse: AddPaymentViewController = segue.sourceViewController as! AddPaymentViewController
    var newItem: CPaymentInfo? = sourse.newPaymentItem
    if let new = newItem {
        self.testLabel.text = "\(new.paymentValue)"
        var defaults = NSUserDefaults.standardUserDefaults()
        var data: NSData = NSKeyedArchiver.archivedDataWithRootObject(new)
        defaults.setObject(data, forKey: "testing1")
    }