Tableview reloadData不能与显示NSUserDefaults数组的tableView一起使用

时间:2017-11-30 12:05:31

标签: swift uitableview nsuserdefaults reloaddata

我的tableView显示array存储的NSUserDefaults。在尝试删除其中一行时,我能够更新存储的默认值的数组,但这不会反映在tableView中。

简而言之tableview.reloadData因某种原因无法重新加载tableView

以下是我在usedefaults

中调用UIViewController的代码
   override func viewDidAppear(_ animated: Bool) {
    encodedData = UserDefaults.standard.object(forKey: "newSave") as? NSData
    saveArticlesArray = (NSKeyedUnarchiver.unarchiveObject(with: encodedData! as Data) as? [SaveArticle])!
    offTableView.reloadData()
}

//populating the table

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCell(withIdentifier: "OfflineCell", for: indexPath) as! OfflineTableViewCell
   cell.offTitle.text = saveArticlesArray[indexPath.row].saveTitle
    return cell
}

//Deleting a row and its related stored userdefault

   func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == UITableViewCellEditingStyle.delete{
         var tempArray: [AnyObject] = saveArticlesArray as [AnyObject]
        tempArray.remove(at: indexPath.row)
        DispatchQueue.main.async{
            print("reached dispacth")
            //self.offTableView.reloadData()
            tableView.reloadData()
        }

        encodedData = NSKeyedArchiver.archivedData(withRootObject: tempArray) as NSData
        UserDefaults.standard.set(encodedData, forKey: "newSave")
        UserDefaults.standard.synchronize()
    }    
}

请注意,当我关闭并重新打开ViewController时,所选行的值会被删除。我只需要重新加载tableView,以便用户可以看到该行已被删除。

1 个答案:

答案 0 :(得分:0)

将此方法替换为tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath),希望这可以解决您的问题。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == UITableViewCellEditingStyle.delete{
        saveArticlesArray.remove(at: indexPath.row)
        DispatchQueue.main.async{
            print("reached dispacth")
            //self.offTableView.reloadData()
            tableView.reloadData()
        }

        encodedData = NSKeyedArchiver.archivedData(withRootObject: saveArticlesArray) as NSData
        UserDefaults.standard.set(encodedData, forKey: "newSave")
        UserDefaults.standard.synchronize()
    }
}