Post

Replies

Boosts

Views

Activity

Reply to How to add UserDefaults to save a table view button status?
I cannot tell you how much I appreciate your help. I'm actually getting the error: Cannot assign value of type 'String' to type '[QuotesMainViewController.Quote]' I put the code below. import UIKit class QuotesMainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {       @IBOutlet weak var quotesTableView: UITableView!       struct Quote {    var label: String    var like: Bool = false // a priori, false   }       var quoteList: [Quote] = []           override func viewDidLoad() {     super.viewDidLoad()           quotesTableView.delegate = self     quotesTableView.dataSource = self           let defaults = UserDefaults.standard     quoteList = UserDefaults.standard.string(forKey: "QuoteListKey") ?? [Quote(label: "Quote1"), Quote(label: "Quote2"), Quote(label: "Quote3")]         }       @IBAction func likeTapped(_ sender: UIButton) {          quoteList[sender.tag].like.toggle() // update the dataSource ; sender.tag gives the row in the array     if quoteList[sender.tag].like {      sender.setImage(UIImage(named: "GreenHeart"), for: .normal) // You can change here or ask for a reloadData()     } else {      sender.setImage(UIImage(named: "blankHeart"), for: .normal)     }     let defaults = UserDefaults.standard     defaults.set(quoteList, forKey: "QuoteListKey")  // or defaults.set(quoteLikes, forKey: "LikeKey")         }           func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {     return quoteList.count   }       func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    let cell = quotesTableView.dequeueReusableCell(withIdentifier: "cell") as! QuotesTableViewCell          cell.quoteLabel.text = quoteList[indexPath.row].label    cell.likeButton.tag = indexPath.row  // Use tag to reference the cell, not to set true / false     cell.likeButton.setImage(UIImage(named: quoteList[indexPath.row].like ? "GreenHeart" : "blankHeart"), for: .normal)    return cell   }     } import UIKit class QuotesTableViewCell: UITableViewCell {   @IBOutlet weak var likeButton: UIButton!   @IBOutlet weak var quoteLabel: UILabel!       override func awakeFromNib() {     super.awakeFromNib()     // Initialization code   }   override func setSelected(_ selected: Bool, animated: Bool) {     super.setSelected(selected, animated: animated)     // Configure the view for the selected state   } }
Topic: UI Frameworks SubTopic: UIKit Tags:
Mar ’22
Reply to How to add UserDefaults to save a table view button status?
So I got it to work as well until I added the decode to ViewDidLoad. Until that point the table populated and the buttons worked properly, but nothing was saved when the app was closed and reopened (as expected). However, now that I added that part of the code to viewDidLoad, the table does not populate. I only get an empty table. I must have missed something. Would you mind taking one last look? import UIKit class QuotesMainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {       @IBOutlet weak var quotesTableView: UITableView!       struct Quote: Codable {     var label: String     var like: Bool = false // a priori, false    }       var quoteList: [Quote] = []           override func viewDidLoad() {     super.viewDidLoad()           quotesTableView.delegate = self     quotesTableView.dataSource = self           let defaults = UserDefaults.standard     if let data = defaults.data(forKey: "QuoteListKey") {       let array = try! PropertyListDecoder().decode([Quote].self, from: data)     } else {        quoteList = [Quote(label: "Quote1"), Quote(label: "Quote2"), Quote(label: "Quote3")]     }                     }       @IBAction func likeTapped(_ sender: UIButton) {          quoteList[sender.tag].like.toggle() // update the dataSource ; sender.tag gives the row in the array     if quoteList[sender.tag].like {      sender.setImage(UIImage(named: "GreenHeart"), for: .normal) // You can change here or ask for a reloadData()       if let data = try? PropertyListEncoder().encode(quoteList) {         UserDefaults.standard.set(data, forKey: "QuoteListKey")       }                     } else {      sender.setImage(UIImage(named: "blankHeart"), for: .normal)     }              }           func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {     return quoteList.count   }       func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    let cell = quotesTableView.dequeueReusableCell(withIdentifier: "cell") as! QuotesTableViewCell          cell.quoteLabel.text = quoteList[indexPath.row].label    cell.likeButton.tag = indexPath.row  // Use tag to reference the cell, not to set true / false     cell.likeButton.setImage(UIImage(named: quoteList[indexPath.row].like ? "GreenHeart" : "blankHeart"), for: .normal)    return cell   }         }
Topic: UI Frameworks SubTopic: UIKit Tags:
Apr ’22