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

时间:2015-09-28 22:46:48

标签: ios swift uitableview core-data

我正在从UITableView中删除一行,该行从CoreData接收其信息。目前,我已经弄清楚它可以删除CoreData信息的位置,但它没有消除UITableView中的行。我使用的大多数方法都会导致崩溃。这是原始代码(credit: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()
}
}

2 个答案:

答案 0 :(得分:0)

这一行

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

应该更改为此方法,因为它应该an array of indexPath而不是array indexPath.row

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

答案 1 :(得分:0)

你做得太多了。这应该(粗略地)根据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,但它也没有。{/ p>