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

Сколько новых счетов на SO в неделю вы собираетесь создать, Лукас? ;-) – vadian

+0

Я не делаю счета – MazzaMan

ответ

1

Не используйте значениеForKey/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 вы сохраните ранее сохраненное значение, а не новое значение.

Try:

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 для них, но вам нужно.

+0

Спасибо, что работало сейчас, мне просто нужно выяснить, где я пошла не так, и спасибо за совет! – MazzaMan

Смежные вопросы