使用 tableview 和 CoreDataStack 以及 Diffable 数据源删除核心数据中的记录

问题描述

如果我问错了或包含了太多代码,请见谅。我做的最后一个编程是在 amiga 和 Psion 组织者上使用 basic。所以我是 swift 的新手,甚至是堆栈溢出的新手。 我正在使用来自各种来源的信息(Angela Yu、Ray Wenderlich、google 和 stack overflow 以及许多其他来源,并且感到困惑。我正在尝试创建一个简单的数据库应用程序并实现了很多我想要的,但我可以现在不使用滑动删除或确实执行删除记录。我需要知道的是 a] 我需要什么代码来执行一个单元格的滑动并删除与之相关的数据。我已经包含了我正在使用的函数,直到我改变了一些东西。 b] 我认为我说我采用了不止一种方法是正确的,所以如果有人能建议可以改进的地方,我将非常感激。

  import UIKit
import CoreData

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    
    
//    var people: [NSManagedobject] = []
    var people = [DriverName]()
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    lazy var coreDataStack = CoreDataStack(modelName: "RDW_Monitor")
    var dataSource: UITableViewDiffableDataSource<String,DriverName>?
    fileprivate let driverCellIdentifier = "driverandRDWCell"
    
    lazy var fetchedResultsController: NSFetchedResultsController<DriverName> = {
        let fetchRequest: NSFetchRequest<DriverName> = DriverName.fetchRequest()
        let nameSort = NSSortDescriptor(key: #keyPath(DriverName.name),ascending: true)
        let rdwSort = NSSortDescriptor(key: #keyPath(DriverName.total),ascending: true)
        fetchRequest.sortDescriptors = [rdwSort,nameSort]
        
        let fetchedResultsController = NSFetchedResultsController(
            fetchRequest: fetchRequest,managedobjectContext: coreDataStack.managedContext,sectionNameKeyPath: nil,cacheName: "driverName")
        
        fetchedResultsController.delegate = self
        return fetchedResultsController
    }()
    
    
    var totalNumberOfdrivers = 0
    var vaughansTotal = 0

    
    override func viewDidLoad() {
        super.viewDidLoad()
        

          tableView.rowHeight = 30

        loadDrivers()
        getDriverTotal(nametoGet: "Wingrove V")
        title = "Driver Names & Total RDW \(totalNumberOfdrivers)"

        dataSource = setupDataSource()
        self.tableView.reloadData()

          
    }

func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return people.count
    }
    
    override func viewDidAppear(_ animated: Bool) {
      super.viewWillAppear(animated)
        
        UIView.performWithoutAnimation {
            do {
                try fetchedResultsController.performFetch()
            } catch let error as NSError {
                print("Fetching error: \(error),\(error.userInfo)")
            }
        }
      

    }

    
    //---------------------------------------------------------------------------------------
//MARK: - ADD a name
    @IBAction func addName(_ sender: UIBarButtonItem) {
        let alertController = UIAlertController(title: "Add Driver",message: nil,preferredStyle: .alert)
        
        alertController.addTextField { (newDriverName) in
            newDriverName.placeholder = "Name"
        }
        alertController.addTextField(configurationHandler: { (newRDW) in
            newRDW.keyboardType = .numberPad
            newRDW.placeholder = "Starting Number of RDW"
            
        })
        let saveAction = UIAlertAction(title: "Save",style: .default) {_ in

            if alertController.textFields![0].hasText && alertController.textFields![1].hasText {
            let newDriverNameField = alertController.textFields![0]
            let newRDWField = alertController.textFields![1]
            let newRDW = Int(newRDWField.text!)
                let driverName = DriverName(context: self.coreDataStack.managedContext)
                driverName.name = newDriverNameField.text
                driverName.totalText = newRDWField.text
                driverName.total = Int32(newRDW!)
                self.coreDataStack.saveContext()
                self.totalNumberOfdrivers += 1
            self.title = "Driver Names & Total RDW \(self.totalNumberOfdrivers)"
            self.tableView.reloadData()
            } else {
                return
            }
        }

          
          let cancelAction = UIAlertAction(title: "Cancel",style: .cancel)
     
        alertController.addAction(saveAction)
        alertController.addAction(cancelAction)
          
          present(alertController,animated: true)
    }
    
    //MARK: - Load Drivers
    func loadDrivers() {
            let request : NSFetchRequest<DriverName> = DriverName.fetchRequest()
            do {
              people = try context.fetch(request)
            } catch {
            print("Error fetching data from context \(error)")
            }
        }
        
    //MARK: - Get Driver Total
    func getDriverTotal(nametoGet: String) {
        let nameFetch: NSFetchRequest<DriverName> = DriverName.fetchRequest()
        nameFetch.predicate = nspredicate(format: "%K == %@",#keyPath(DriverName.name),nametoGet)

        var x = 0

        totalNumberOfdrivers = people.count

        while x != people.count {

          let person = people[x]
            if person.value(forKeyPath: "name") as! String == nametoGet {
                vaughansTotal = person.value(forKeyPath: "total") as! Int

            }
            x = x + 1
        }
    }

    //---------------------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------------------
    //MARK: - delete a row
    
//    func tableView(_ tableView: UITableView,canEditRowAt indexPath: IndexPath) -> Bool {
//        return true
//      }
//    func tableView(_ tableView: UITableView,commit editingStyle: UITableViewCell.EditingStyle,forRowAt indexPath: IndexPath) {
//        if editingStyle == .delete {
//
//            guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
//                return
//            }
//            let managedContext = appDelegate.persistentContainer.viewContext
//            managedContext.delete(driverName[indexPath.row])
//            do {
//                try managedContext.save()
//            } catch {
//
//            }
//            driverName.remove(at: indexPath.row)
//           tableView.deleteRows(at: [indexPath],with: .fade)
//
//            totalNumberOfdrivers -= 1
//            title = "Driver Names & Total RDW \(totalNumberOfdrivers)"
//            self.tableView.reloadData()
//
//        } 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.
//        }
//    }


}



// MARK: - Internal
extension ViewController {

  func setupDataSource() -> UITableViewDiffableDataSource<String,DriverName> {
    return UITableViewDiffableDataSource(tableView: tableView) { [uNowned self](tableView,indexPath,driverName) -> UITableViewCell? in
      let cell = tableView.dequeueReusableCell(withIdentifier: self.driverCellIdentifier,for: indexPath)
      self.configure(cell: cell,for: driverName)
      return cell
    }
  }

  func configure(cell: UITableViewCell,for driverName: DriverName) {

    guard let cell = cell as? DriverNameCell else {
      return
    }

    if vaughansTotal < driverName.total {

        cell.detail.textColor = UIColor.red
        cell.title.text = driverName.name
        cell.detail.text = driverName.totalText
        
    } else {

        cell.detail.textColor = UIColor.black
        cell.title.text = driverName.name
        cell.detail.text = driverName.totalText
    }

  }
}



// MARK: - NSFetchedResultsControllerDelegate
extension ViewController: NSFetchedResultsControllerDelegate {

  func controller(
    _ controller: NSFetchedResultsController<NSFetchRequestResult>,didChangeContentWith
    snapshot: NSDiffableDataSourceSnapshotReference) {

    var diff = NSDiffableDataSourceSnapshot<String,DriverName>()
    snapshot.sectionIdentifiers.forEach { section in

      diff.appendSections([section as! String])

      let items = snapshot.itemIdentifiersInSection(withIdentifier: section)
        .map { (objectId: Any) -> DriverName in
          let oid =  objectId as! NSManagedobjectID
          return controller.managedobjectContext.object(with: oid) as! DriverName
      }

      diff.appendItems(items,toSection: section as? String)
    }

    dataSource?.apply(diff)
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)