滑动删除函数插入,包括核心数据

Posted

技术标签:

【中文标题】滑动删除函数插入,包括核心数据【英文标题】:Swipe to delete function insert including Core Data 【发布时间】:2020-01-28 14:38:22 【问题描述】:

我正在尝试做一个简单的名单应用程序。我看过这个视频并复制了所有内容(https://www.youtube.com/watch?v=tP4OGvIRUC4) 我现在想添加一个滑动删除功能。它按照我希望的方式工作,但是当我关闭并重新打开应用程序时,它会像以前一样。 我尝试了不同的方法,但没有成功。

有人有什么想法吗?

来自瑞士的问候

这是我的视图控制器:

import UIKit
import CoreData

class ViewController: UIViewController 

@IBOutlet weak var tableView: UITableView!

    var people = [Person]()

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()

        do 
          let people = try PersistenceServce.context.fetch(fetchRequest)
            self.people = people
            self.tableView.reloadData()
        catch
    

    @IBAction func onPlusTapped() 
        let alert = UIAlertController(title: "Add name", message: nil, preferredStyle: .alert)
        alert.addTextField  (textField) in
            textField.placeholder = "Name"

        
        let action = UIAlertAction(title: "Add", style: .default)  (_) in
            let name = alert.textFields!.first!.text!
            let person = Person(context: PersistenceServce.context)
            person.name = name
            PersistenceServce.saveContext()
            self.people.append(person)
            self.tableView.reloadData()

        
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    


extension ViewController: UITableViewDataSource 
    func numberOfSections(in tableView: UITableView) -> Int 
         return 1
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return people.count
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = UITableViewCell(style: .subtitle, reuseIdentifier: nil)
        cell.textLabel?.text = people[indexPath.row].name
        return cell
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 

        guard editingStyle == UITableViewCell.EditingStyle.delete else  return 
        people.remove(at: indexPath.row)

        tableView.deleteRows(at: [indexPath], with: .automatic)
        self.tableView.reloadData()
    

【问题讨论】:

您好,您只能从数组中删除。更多信息在这里:***.com/questions/37176861/… 这能回答你的问题吗? How to swipe delete core data tableview in Swift 2.0 【参考方案1】:

您只是从本地数组中删除项目,您需要在删除后保留更改。

【讨论】:

【参考方案2】:

当您重新加载应用程序时,您的表会再次从 fetch 中获取数据,您已删除的数据将保留在该位置。如果您喜欢在 fetch 中删除数据,请查看此主题 Core Data Delete Object

【讨论】:

【参考方案3】:

这就是我之前的做法。

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? 
        // deleteAction, Call the deleteobject function, and then reload the data
        let deleteAction  = UITableViewRowAction(style: .default, title: DELETE_TITLE)  (rowAction, indexPath) in
            _ = deleteObject(name: self.dataSource[indexPath.row].name)
            self.tableview.reload()
        
     return [deleteAction]



func deleteObject(name: String) -> Bool 
        let context = getContext()
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: ENTITY_NAME)
        fetchRequest.predicate = NSPredicate(format: formatStringForPredicate(oldListName: name))
        let objects = try! context.fetch(fetchRequest)
        for obj in objects 
            context.delete(obj as! NSManagedObject)
        
        do 
            try context.save()
            return true
         catch 
            return false
        
    

请注意,您可能需要修改 deleteObject 函数。

【讨论】:

【参考方案4】:

首先,永远不要在insertRows(atdeleteRows(at 之后调用reloadData(),因为插入/删除方法确实会更新用户界面。

要使删除持久化,您必须删除上下文中的项目并保存上下文。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 

    guard editingStyle == .delete else  return 
    let personToDelete = people.remove(at: indexPath.row)
    PersistenceServce.context.delete(personToDelete)
    tableView.deleteRows(at: [indexPath], with: .automatic)
    PersistenceServce.saveContext()

【讨论】:

非常感谢。由于您的代码行,它可以工作。我很高兴能在不到 24 小时内汇集这么多好的答案,帮助我更好地理解核心数据这一主题。【参考方案5】:

为了对核心数据做任何事情,它需要将所有必要的对象加载到内存中,这将由您的上下文访问,一旦您将要删除的项目加载到上下文中,您需要做的就是简单地 context.delete(项目) tableViewArray.remove(at: itemIndex in array) 然后调用 context.save() 来保存你对持久化存储所做的更改

【讨论】:

以上是关于滑动删除函数插入,包括核心数据的主要内容,如果未能解决你的问题,请参考以下文章

手势识别器滑动以从核心数据中删除

如何在 Swift 2.0 中滑动删除核心数据表视图

滑动删除 UITableView (iOS) 中的整个部分

一旦按下滑动删除按钮,删除功能(提交编辑样式功能)会导致应用程序崩溃

JQ库函数记忆要点

Jquery 大纲