Coder
Coder

Reputation: 529

NSUserDefaults errors on Swift 2.0

For some reasons, I can't seem to get my NSUserDefaults to work correctly under Swift 2.0. It work fine under the older version, but under Swift 2.0, it doesn't work. I know the coding has been changed for Swift 2.0, but for some reason, all the information filled in the tableview goes away once I leave that page. Any suggestions?

import UIKit

class MainTableViewController: UITableViewController, UITextFieldDelegate {

    @IBOutlet weak var name: UITextField!

    @IBAction func btnSave() {

            let userDefaults = NSUserDefaults.standardUserDefaults()

            if name.text == "" {


                let alert = UIAlertController(title: "Data", message: "Missing Name.", preferredStyle: UIAlertControllerStyle.Alert)

                alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

                self.presentViewController(alert, animated: true, completion: nil)

                let userDefaults = NSUserDefaults.standardUserDefaults()

                NSUserDefaults.standardUserDefaults().setObject(name, forKey:"name")

                userDefaults.synchronize()

        }

        override func viewDidLoad() {

            let defaults = NSUserDefaults.standardUserDefaults()

            defaults.setObject(" ", forKey: "name")

            super.viewDidLoad()

               }
        }

Upvotes: 0

Views: 101

Answers (2)

Ramsy de Vos
Ramsy de Vos

Reputation: 1072

Perhaps try this

import UIKit

class MainTableViewController: UITableViewController, UITextFieldDelegate {

  let userDefaults = NSUserDefaults.standardUserDefaults()

  @IBOutlet weak var name: UITextField!

  @IBAction func btnSave() {


    if name.text == "" {

      let alert = UIAlertController(title: "Data", message: "Missing Name.", preferredStyle: UIAlertControllerStyle.Alert)

      alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

      self.presentViewController(alert, animated: true, completion: nil)

    } else {

      userDefaults.setObject(name.text, forKey:"name")

      userDefaults.synchronize()
    }
  }

  override func viewDidLoad() {

    super.viewDidLoad()

  }

  override func viewDidAppear(animated: Bool) {

    name.text = userDefaults.stringForKey("name")

  }
}

Upvotes: 1

fdiaz
fdiaz

Reputation: 2600

In your viewDidLoad you're erasing the info in name, so everytime you enter your view, it will get deleted.

override func viewDidLoad() {
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.setObject(" ", forKey: "name")
    super.viewDidLoad()
}

Also, since name is a UITextField and not a String, when you're saving your name, it should be done like this:

NSUserDefaults.standardUserDefaults().setObject(name.text, forKey:"name")

instead of this:

NSUserDefaults.standardUserDefaults().setObject(name, forKey:"name")

Also, inside your btnSave() method, you're only saving the name.text if it's equal to "". So if you enter any other information, it won't be saved. I'd recommend modifying it so it looks something like this (you could use guard instead of if name.text also):

@IBAction func btnSave() {
    if name.text == "" {
        let alert = UIAlertController(title: "Data", message: "Missing Name.", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
        return
    }

    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(name.text, forKey:"name")
    userDefaults.synchronize()
}

P.S: Remember that NSUserDefaults is intended for user preferences. I'd recommend against saving large amounts of data into NSUserDefaults.

Upvotes: 0

Related Questions