首页 > 解决方案 > 滑动删除重新出现在收藏选项卡中的项目

问题描述

所以我正在尝试从收藏夹选项卡中删除我最喜欢的项目。滑动实现有效,但是当我返回收藏夹选项卡时,删除的项目重新出现。我正在使用核心数据,我知道它不会从核心数据中删除它,但不知道如何修复它。这是我的收藏选项卡文件:

import UIKit
import CoreData

class FavAnimeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    @IBOutlet var tableView: UITableView!
    
    var favorites = [NSManagedObject]()
    var numAnime = 0
    var managedObjectContext: NSManagedObjectContext!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.dataSource = self
        tableView.delegate = self
        // Do any additional setup after loading the view.
    }
    //loads every time view appears
    override func viewDidAppear(_ animated: Bool) {
        load()
    }
    
    func load() {
        //1
        guard let appDelegate =
                UIApplication.shared.delegate as? AppDelegate else {
            return
        }
        let managedContext =
            appDelegate.persistentContainer.viewContext
        //2
        let fetchRequest =
            NSFetchRequest<NSManagedObject>(entityName: "Favorite")
        //3
        do {
            favorites = try managedContext.fetch(fetchRequest)
            tableView.reloadData()
        } catch let error as NSError {
            print("Could not fetch. \(error), \(error.userInfo)")
        }
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return favorites.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier:  "FavTableViewCell") as! FavTableViewCell
        
        let favAnime = favorites[indexPath.row]
        cell.favtitleLabel.text = favAnime.value(forKeyPath: "title") as? String
        cell.favsumLabel.text = favAnime.value(forKeyPath: "synopsis") as? String
        if let poster = favAnime.value(forKey: "poster") as? String{
            let posterUrl = URL(string: poster)!
            cell.favposterView.af.setImage(withURL: posterUrl)

        }
        
        return cell
    }
    //MARK: Delete favorite items
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            favorites.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
        } else if editingStyle == .insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
        }
    }
    
}

如果有任何帮助,那就太好了

标签: swiftxcodecore-data

解决方案


在保存状态之前,这些更改(在这种情况下Delete)不会受到影响,有用的是NSManagedObjectContext,托管对象上下文具有匹配的delete()方法,该方法将删除任何对象,无论其在对象图中的类型或位置如何。一旦从上下文中删除了一个对象,我们就可以调用saveContext()将该更改写回持久存储,以便该更改是永久性的。

do {
  try managedObjectContext.save()
} catch (let error) {
  print(error.localizedDescription)
}

请记住:当您希望您的更改持续存在时,您必须调用saveContext() 。

我希望我有帮助!

核心数据 | nsmanagedobject上下文


推荐阅读