【问题标题】:NSUser defaults not saving correctly?NSUser 默认保存不正确?
【发布时间】:2015-11-25 18:25:46
【问题描述】:

所以最近我一直在制作一个具有文本字段和标签的练习应用程序。当您在文本字段中输入内容并点击保存时,它应该将标签更改为该文本并保存。它保存的原因是当您打开应用程序时,标签的文本等于您保存的最后一个内容。如果您在文本框中的新字符串上点击保存,文本将再次保存。

我遇到的问题是,在您保存新内容并且字符串未保存之前,标签不会与文本一起出现,因此即使您保存了某些内容,它们也不会出现。

这是我在 ViewController.swift 中的代码:

    //
//  ViewController.swift
//  Help
//
//  Created by Lucas on 9/30/15.
//  Copyright (c) 2015 Lucas. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet var Savedlbl: UILabel!
    @IBOutlet var Textfield: UITextField!
    @IBOutlet var Label: UILabel!


    var current = ""
    var Saved = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        let currentDefault = NSUserDefaults.standardUserDefaults()

      Savedlbl.text = Saved



        if(currentDefault.valueForKey("Saved") != nil)
        {
            self.Saved = currentDefault.valueForKey("Saved") as! NSString! as String

        }
        // Do any additional setup after loading the view, typically from a nib.
    }
    @IBAction func Set(sender: AnyObject) {


        setall()


    }
func setall()
    {
        current = Textfield.text!
        Label.text = Textfield.text!



        let currentDefault = NSUserDefaults.standardUserDefaults()

       Saved = (currentDefault.valueForKey("saved") as? String)!
        currentDefault.setValue(Saved, forKey: "saved")


        Savedlbl.text = Textfield.text



         currentDefault.synchronize()
            }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

这是我认为问题在于视图确实加载的地方。当应用程序加载时,它不会将其设置为最后保存的内容。

    import UIKit

class ViewController: UIViewController {

    @IBOutlet var Savedlbl: UILabel!
    @IBOutlet var Textfield: UITextField!
    @IBOutlet var Label: UILabel!


    var current = ""
    var Saved = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        let currentDefault = NSUserDefaults.standardUserDefaults()

      Savedlbl.text = Saved



        if(currentDefault.valueForKey("Saved") != nil)
        {
            self.Saved = currentDefault.valueForKey("Saved") as! NSString! as String

        }
        // Do any additional setup after loading the view, typically from a nib.
    }

谢谢,如果您需要更多信息,请告诉我,我会尽快提供!

【问题讨论】:

  • 在视图中加载了你还没有获取标签的默认值。它也总是显示为空
  • 卢卡斯,您每周要在 SO 上创建多少个新帐户? ;-)
  • 我没有开户
  • 卢卡斯·马扎?杰夫?所有关于具有相同描述标题的几乎相同代码的问题......
  • 大声笑,我的其他帐户有问题。

标签: ios swift nsuserdefaults


【解决方案1】:

不要使用 valueForKey/setValue:forKey:。这些是 KVC 方法。你想要setObject:forKey:objectForKey:

【讨论】:

【解决方案2】:

你的问题是你做事的顺序不对。在viewDidLoad 中,您在从用户默认值中检索值之前设置文本字段,而在setall 中,您正在重新保存以前保存的值,而不是新值。

试试:

import UIKit

class ViewController: UIViewController {

    var saved=""
    var current=""
    @IBOutlet var Savedlbl: UILabel!
    @IBOutlet var Textfield: UITextField!
    @IBOutlet var Label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let currentDefault = NSUserDefaults.standardUserDefaults()
        self.saved=currentDefault.stringForKey("Saved") ?? ""
        self.Savedlbl.text=self.saved

    }

    @IBAction func Set(sender: AnyObject) {
        setall()
    }

    func setall() {
        self.current = self.Textfield.text!
        self.Label.text = self.current

        let currentDefault = NSUserDefaults.standardUserDefaults()
        currentDefault.setObject(self.current,forKey:"Saved")

        self.Savedlbl.text = self.Textfield.text
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

此外,按照惯例,变量应以小写字母开头,类以大写字母开头。我将Saved 更改为saved 并将Current 更改为current,但我没有更改IBOutlets,因为您需要在IB 中为它们重新建立连接,但您应该这样做。

【讨论】:

  • 感谢现在有效,我只需要弄清楚我哪里出错了,感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多