gpt4 book ai didi

swift - 使用 Swift 3 和 CoreData 删除 TableView 行

转载 作者:行者123 更新时间:2023-11-28 09:43:10 25 4
gpt4 key购买 nike

我正在尝试实现滑动以删除我的应用程序中的表格 View 单元格,但我遇到了崩溃:

'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

我有我的 ViewController,在 ViewControllerDataSource 文件中,我符合 UITableViewDataSource

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let managedObjectContext = appDelegate.managedObjectContext, editingStyle == .delete else { return }

let request: NSFetchRequest<Meditation> = NSFetchRequest(entityName: "Meditation")
let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
request.sortDescriptors = [sortDescriptor]

if let sessions = try? managedObjectContext.fetch(request) as [Meditation] {
managedObjectContext.delete(sessions[indexPath.row])

tableView.deleteRows(at: [indexPath], with: .fade)
fetchEntries {
tableView.reloadData()
}
}
}

这就是 fetchEntries 的样子

func fetchEntries(completion: (() -> Void)? = nil) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let managedObjectContext = appDelegate.managedObjectContext
else { return }

var arrayOfEntries: [Entry] = []
let request: NSFetchRequest<Meditation> = NSFetchRequest(entityName: "Meditation")
let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
request.sortDescriptors = [sortDescriptor]

if let objects = try? managedObjectContext.fetch(request) as [Meditation] {
meditationSessions = objects

for (index, object) in objects.enumerated() {
// set some values that correspond to visual elements in the cell

let timeLabel = lengthMinutesLabel(minutesString: lengthMinutes(object.length))

let entry = Entry(
sessionLength: lengthMinutes(object.length),
sessionTimeUnit: timeLabel,
sessionStartTime: "\(object.date.format())",
sessionJournalEntry: object.journalEntry,
sessionStreakTop: showStreak.top,
sessionStreakBottom: showStreak.bottom
)

arrayOfEntries.append(entry)
self.arrayOfEntries = arrayOfEntries
}
}

completion?()
}

我不太确定我在这里做错了什么导致了这次崩溃。不幸的是,如果崩溃是由竞争条件引起的,则 CoreData 删除功能没有完成 block 。

我对 tableView:editingStyle: 函数的最后 7-9 行尝试了各种不同的操作顺序,但都无济于事。任何的意见都将会有帮助。谢谢!

最佳答案

Updated for swift 3:

如果您想在使用 Core Data 时删除 UITableView 行/单元格,请使用以下代码行:

import CoreData

//MARK:- 变量声明

@IBOutlet weak var mTableView: UITableView!
var manageObjectContext: NSManagedObjectContext!
var eventArray = [Event]() // Where **Event** is an model name

//标记:- ViewController 生命周期方法

override func viewDidLoad() {
super.viewDidLoad()
manageObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
self.loadSaveData()
}

//从表格 View 中删除特定的单元格/行

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

let eventArrayItem = eventArray[indexPath.row]

if editingStyle == .delete {
manageObjectContext.delete(eventArrayItem)

do {
try manageObjectContext.save()
} catch let error as NSError {
print("Error While Deleting Note: \(error.userInfo)")
}
}
self.loadSaveData()
}

//MARK:- 实例方法

func loadSaveData()  {

let eventRequest: NSFetchRequest<Event> = Event.fetchRequest()
do{
eventArray = try manageObjectContext.fetch(eventRequest)
self.mTableView.reloadData()
}catch
{
print("Could not load save data: \(error.localizedDescription)")
}
}

关于swift - 使用 Swift 3 和 CoreData 删除 TableView 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42265221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com