Search code examples
iosswiftuitableviewnsuserdefaults

How to delete user default data in tableView?


I added a homework page using the user default. Null value also adding to tableView and delete function not working.

ButtonAction

 @IBAction func addHomeWork(_ sender: Any) {
        let newHomeWork = HomeWork(addtitle:addHomeworktxt.text!)
        HomeWork.saveHomeWork(homeWork: newHomeWork)
    }

viewWillAppear

   override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        if let arrayDetails = HomeWork.getHomeWork() {
            homeWorkArray = arrayDetails
        }
    }

EditingStyle

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCell.EditingStyle.delete {
        homeWorkArray.remove(at: indexPath.row)
        self.tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
        self.tableView.reloadData()
        HomeWork.getHomeWork()
    }
}

model class HomeWork

class HomeWork: Codable {
    var title:String
    init(addtitle:String) {
        self.title = addtitle}

    public static func getHomeWork() -> [HomeWork]? {
        var homeWorkArray:[HomeWork] = []
        if let homeWorkData = UserDefaults.standard.data(forKey: "homeworkData"){
            homeWorkArray = try! JSONDecoder().decode([HomeWork].self, from: homeWorkData)
        }
        return homeWorkArray
    }

saveHomeWork method in HomeWork model class

    public static func saveHomeWork(homeWork:HomeWork){
        var retrivedHomeWorkArray:[HomeWork] = []

        if  let homeWorkData = UserDefaults.standard.data(forKey: "homeworkData"){
            retrivedHomeWorkArray = try! JSONDecoder().decode([HomeWork].self, from: homeWorkData)
        }


        if retrivedHomeWorkArray.count == 0 {
            var homeWorkArray = [HomeWork]()
            homeWorkArray.append(homeWork)
            let homeWorkDat = try! JSONEncoder().encode(homeWorkArray)
            UserDefaults.standard.set(homeWorkDat, forKey: "homeworkData")
        }else{

            retrivedHomeWorkArray.append(homeWork)
            let homeWorkDat = try! JSONEncoder().encode(retrivedHomeWorkArray)
            UserDefaults.standard.set(homeWorkDat, forKey: "homeworkData")  } }}

Solution

  • When you delete , you don't alter saved array

    homeWorkArray.remove(at: indexPath.row)
    self.tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
    self.tableView.reloadData()
    HomeWork.getHomeWork()
    

    so consider adding a function that re-saves the current array like

    public static func reSave(homeWorks:[HomeWork]){ 
      let homeWorkDat = try! JSONEncoder().encode(homeWorks)
      UserDefaults.standard.set(homeWorkDat, forKey: "homeworkData") 
    }
    

    then replace above code with

    homeWorkArray.remove(at: indexPath.row)
    self.tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic) 
    HomeWork.reSave(homeWorks:homeWorkArray)