简体   繁体   中英

How can I load all the data stored in the array, when the app starts again (Swift)?

I have to implement a function that loads the stored data into the shopping list array, when the app starts, and a function that stores the current contents of my list when the button is pressed. I used UserDefaults class and it works for the second function (when the button is pressed) but not for the first one (when the app starts). If I restart the app and press the button, I see that only the last input was stored. How can I fix the code if I want to store all data from the array?

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var inputEntered: UITextField!

    // keyboard gives up the first responder status and goes away if return is pressed

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        inputEntered.resignFirstResponder()
        return true
    }

    var shoppingList: [String] = []

    @IBAction func buttonAddToList(_ sender: UIButton) {
        if let item = inputEntered.text, item.isEmpty == false { // need to make sure we have something here
            shoppingList.append(item) // store it in our data holder
        }
        inputEntered.text = nil // clean the textfield input

        print(shoppingList.last!) // print the last element to avoid duplicates on the console

        storeData()
    }

    // this function stores the current contents of my list when the button is pressed

    func storeData () {
        let defaults = UserDefaults.standard
        defaults.set(inputEntered.text, forKey: "Saved array")
        print(defaults)
    }

    // to call the function storeDate(), when the app restarts 

    override func viewDidLoad() {
        super.viewDidLoad()
        inputEntered.delegate = self
        // Do any additional setup after loading the view.
        storeData()
    }
}

You can add a getter and a setter to your array and persist your values to user defaults. This way you don't need to call storeData and or remembering to load the data when initialising your array:

var shoppingList: [String] {
    get {
        UserDefaults.standard.stringArray(forKey: "shoppingList") ?? []
    }
    set {
        UserDefaults.standard.set(newValue, forKey: "shoppingList")
    }
}

You are calling storeData() in viewDidLoad, but inputEntered is empty then, so you are storing blank data.

Also, defaults.set(inputEntered.text, forKey: "Saved array") doesn't append new data onto the key -- it overwrites what is there. So you are not storing the array, you are only storing the last value.

You need to store shoppingList to store the array.

I'm unsure if I have got what you are asking for but have you tried looking into UITextFieldDelegate.

If you add this, it will ensure add the protocols of which I am sure there is a method that can be called when the user finishes editing text field.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM