【发布时间】:2017-01-26 14:41:08
【问题描述】:
我的表有一个删除函数,它是获取控制器的委托。当我滑动删除一行时,它会清除对象并删除其数据,但单元格仍保留为空行。
我的 fetch 和 table 代码看起来像这样,知道为什么它也不删除行吗?:
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch (type) {
case .update:
if let indexPath = indexPath, let cell = workoutDesignerTable.cellForRow(at: indexPath) as? RoutineTableViewCell {
configure(cell, at: indexPath)
}
break;
default:
print("...")
}
}
}
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let delete = UITableViewRowAction(style: .destructive, title: "Delete") { (action, indexPath) in
let UserExercise = self.fetchedResultsController.managedObjectContext
UserExercise.delete(self.fetchedResultsController.object(at: indexPath))
do {
try UserExercise.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
self.workoutDesignerTable.reloadData()
}
let edit = UITableViewRowAction(style: .normal, title: "Edit") { (action, indexPath) in
let cell = tableView.cellForRow(at: indexPath)
self.updateExercise = self.fetchedResultsController.object(at: indexPath)
self.performSegue(withIdentifier: self.segueEditUserExerciseViewController, sender: cell)
}
edit.backgroundColor = UIColor.lightGray
return [delete, edit]
}
问题图片如下:
我添加了以下未解决问题的函数
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let UserExercise = fetchedResultsController.managedObjectContext
UserExercise.delete(fetchedResultsController.object(at: indexPath))
do {
try UserExercise.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
tableView.deleteRows(at: [indexPath], with: .fade)
}
这里也是要求的 numberOfRowsInSection
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let userExercises = fetchedResultsController.fetchedObjects else { return 0 }
return userExercises.count
}
我已经添加了上面的控制台打印,以在删除对象的打印后显示,如果这有助于缩小范围,则该对象的打印似乎读作有问题
在下面添加了 fetchresultscontroller 代码
fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserExercise> = {
let fetchRequest: NSFetchRequest<UserExercise> = UserExercise.fetchRequest()
if self.userRoutine == nil {
fetchRequest.predicate = NSPredicate(format: "usersroutine == nil")
} else if self.userRoutine != nil {
fetchRequest.predicate = NSPredicate(format: "usersroutine.name == %@", self.userRoutine!)
}
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "dateCreated", ascending: true)]
//controller config
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.persistentContainer.viewContext, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController.delegate = self
return fetchedResultsController
}()
附加控制器委托代码:
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
workoutDesignerTable.beginUpdates()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
workoutDesignerTable.endUpdates()
updateView()
}
// MARK: - ADDING TABLE ROW AND EDITORIAL FEATURES
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch (type) {
case .update:
if let indexPath = indexPath, let cell = workoutDesignerTable.cellForRow(at: indexPath) as? RoutineTableViewCell {
configure(cell, at: indexPath)
}
break;
default:
print("...")
}
}
}
【问题讨论】:
-
您的
numberOfItemsForRowAtIndexPath方法是什么样的?这就是告诉您的 tableview 显示多少行的方法。 -
我没有那个特定的方法 jsut numberOfRowsInSection 和 CellForTowAt
-
哈哈抱歉我指的是这个方法(numberOfRowsInSection)。
-
现在为您将其添加到 OP 1 秒
-
我刚刚在该函数中运行了一个打印命令,即使在删除它显示运动计数为 1 因此行之后,所以再次必须使用删除函数来清除行或计数最有可能没有更新
标签: ios swift uitableview fetch