arraysswiftuitableview

Trying to have multiple array items appended to a user-defaults property when in a UITableViewCell?


I have been trying to create a "saved features" tab for my app. I embedded a button into my table view cell (which had a star icon - FavouriteStatusButton). When selected it would append the feature title (the name of the cell) to FavouriteFeatureDataBase.

@IBOutlet weak var FeatureTitle: UILabel!

 var array1: [String] = []
    
    var FavouriteFeatureDataBase = UserDefaults.standard

   
    @IBAction func FavouriteStatusButton(_ sender: UIButton) {

                array1.append(FeatureTitle.text!)
                FavouriteFeatureDataBase.set(array1, forKey: "ArrayOfFilteredFeatures")

...

It only seems to do this one cell at a time - For example I select 4 cells,

1: Name1, 2: Name2, 3: Name3 and 4: Name4

Instead of getting ["Name1", "Name2", "Name3", "Name4"], I'll only get ["Name4"].

I suspect this is because it is in the UITableViewCell but I'm not sure.


Solution

  • As mentioned in the comments, you need to retrieve the data first.

    You are storing an array - in order to retrieve it, you can use the array(forKey:) method of UserDefaults:

    if let savedArray = favouriteFeatureDataBase.array(forKey: "ArrayOfFilteredFeatures") as? [String] {
        array1 = savedArray
    }
    

    You should call it somewhere before you append anything to your array, ideally in viewDidLoad() or viewWillAppear(_:):

    @IBOutlet weak var featureTitle: UILabel!
    
    var array1: [String] = []
    var favouriteFeatureDataBase = UserDefaults.standard
    
    @IBAction func favouriteStatusButton(_ sender: UIButton) {
        if let titleText = featureTitle.text {
            array1.append(titleText)
            favouriteFeatureDataBase.set(array1, forKey: "ArrayOfFilteredFeatures")
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Load the saved favourite features when the view is loaded
        loadFavouriteFeatures()
    }
    
    func loadFavouriteFeatures() {
        if let savedArray = favouriteFeatureDataBase.array(forKey: "ArrayOfFilteredFeatures") as? [String] {
            array1 = savedArray
        }
    }