2015-11-25 50 views
1

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

我遇到的问题是,标签不会显示文本,直到您保存新内容并且字符串未保存,因此即使您保存了某些内容,它们也不存在。

下面是从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. 
    } 

谢谢,让我知道如果您需要更多的信息,我会尽快提供!

+0

in View加载了您尚未将默认值添加到标签。它也会一直显示为空 –

+0

卢卡斯每周要创建多少个新账户? ;-) – vadian

+0

我没有账户 – MazzaMan

回答

1

请勿使用valueForKey/setValue:forKey :.那些是KVC方法。您需要setObject:forKey:objectForKey:

+0

甚至不使用'objectForKey'。而是使用实际的'stringForKey'或bool或其他类型 –

+0

我们之前已经进行过聊天。看到这个http://stackoverflow.com/questions/33856563/app-crashing-with-exc-breakpoint-error –

+0

我有一个déjàvue ... – vadian

0

你的问题是你正在做错的顺序。在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更改为savedCurrentcurrent,但我没有更改IBOutlets,因为您需要重新构建IB中的连接,但应该这样做。

+0

谢谢,现在工作,我只需要弄清楚我出错的地方,谢谢你的建议! – MazzaMan