如何在 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 中从一对多关系中获取对象