滑动删除函数插入,包括核心数据
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(at
或deleteRows(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() 来保存你对持久化存储所做的更改
【讨论】:
以上是关于滑动删除函数插入,包括核心数据的主要内容,如果未能解决你的问题,请参考以下文章