如何在 Swift 中从 Core Data 中删除数据时删除 UITableView 行?

Posted

技术标签:

【中文标题】如何在 Swift 中从 Core Data 中删除数据时删除 UITableView 行?【英文标题】:How do I remove a UITableView row while deleting its data from Core Data in Swift? 【发布时间】:2015-09-28 22:46:48 【问题描述】:

我正在从从 CoreData 接收其信息的 UITableView 中删除一行。目前,我已经弄清楚它可以删除 CoreData 信息的位置,但它并没有清除 UITableView 中的行。我使用的大多数方法都导致崩溃。这是原始代码(来源:blog.revivalx.com)

var peopleArray: NSMutableArray = [People]() //People is CoreData entity

@IBOutlet weak var contactTable: UITableView!

let appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
            let context: NSManagedObjectContext = appDel.managedObjectContext!
            context.deleteObject(peopleArray[indexPath.row] as! NSManagedObject)
            peopleArray.removeAtIndex(indexPath.row)
            context.save(nil)

我试过插入:

contactTable.deleteRowsAtIndexPaths([indexPath.row
], withRowAnimation: UITableViewRowAnimation.Automatic)

进入此代码并遇到错误。对于如何同时执行这两种删除,大量的消息来源并没有为我提供答案。

如何在 Swift 中同时从 UITableView 中删除该行及其在 CoreData 中的对应条目?

谢谢

编辑:

这里是完整的函数:

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) 
    if editingStyle == UITableViewCellEditingStyle.Delete 

    let appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
    let context: NSManagedObjectContext = appDel.managedObjectContext!

    context.deleteObject(peopleArray[indexPath.row] as NSManagedObject)
    peopleArray.removeAtIndex(indexPath.row)

    contactTable.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
    context.save(nil)
    contactTable.reloadData()


【问题讨论】:

什么是myList?它与peopleArray 有什么关系?在numberOfRowsInSection 和/或cellForRowAtIndexPath 中使用了哪些? 【参考方案1】:

这一行

contactTable.deleteRowsAtIndexPaths([indexPath.row], withRowAnimation: UITableViewRowAnimation.Automatic)

应该改为这个方法,因为它应该得到an array of indexPath而不是array indexPath.row

contactTable.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)

【讨论】:

谢谢。这是一个改进,但它们似乎仍然不同步。当我在删除 CoreData 之前使用上面的行时,我得到“第 0 节中的行数无效”......如果有帮助,我可以在这里打印出大量的文本。当我之后使用它时,我得到'数组索引超出范围'。 你是什么意思?不要忘记使用reloadData() 评论已更新 - 我不小心按了 Enter。尽管我已将 reloadData() 插入到函数的末尾,但使用 reloadData() 对当前问题没有影响。 你在哪里打电话?是否在commitEditingStyle 方法中 将函数全部添加到原始问题中,包括 reloadData()【参考方案2】:

你做的太多了。这应该(大致)根据 MVC(模型视图控制器)设计模式工作:

Core Data 负责处理数据,即模型。 UITableView 负责显示数据。 您的代码是对用户操作做出反应并告诉模型要做什么的控制器。

用户点击删除,你告诉 Core Data 删除对象并让视图重新加载数据。

所以你应该从你的委托函数中删除deleteRowsAtIndexPaths。将表格视图告诉reloadData 应该会导致UITableView 调用您的数据源委托函数,例如tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)。在该函数中,您向 Core Data 请求正确的数据并将其交给视图。

或者更好的是使用 Swift 和 Core Data 选项创建一个新的 Master-Detail 应用程序,这样您就可以免费获得所有正确的源代码。这段代码处理它的方式与我上面建议的不同:它将表格视图告诉deleteRowsAtIndexPaths,但它也不会两者兼而有之。

【讨论】:

以上是关于如何在 Swift 中从 Core Data 中删除数据时删除 UITableView 行?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中从 Core Data 接收到的排序数组

在 Swift Core Data 中从一对多关系中获取对象

在swift中从本地获取图像

如何在 Swift 中的 Core Data 中保存多个项目

(Swift) 如何对 Core Data 进行模糊搜索?

如何在 Core Data 中使用 swift 4 Codable?