2015-11-25 57 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