如何在 Swift 中的另一个 ViewController 中滑动删除核心数据 TableViewCell(使用行操作)2

How to swipe to delete Core Data TableViewCell (with row action) in another ViewController in Swift 2

首先,我只想说我是 iOS 编程的新手,这是我的第一个应用程序,所以如果我使用了不正确的术语或其他术语,我深表歉意。

我的应用程序已设置为可以使用 Core Data 添加事件,然后 2 个 tableView 将使用来自该事件的信息进行更新。我配置了第一个 tableView,以便我可以滑动以从核心数据中删除单元格和信息。

滑动删除代码:

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    // Enables swipe to delete for cells

    if editingStyle == .Delete {

        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let moc = appDelegate.managedObjectContext

        moc.deleteObject(events[indexPath.row])
        appDelegate.saveContext()

        events.removeAtIndex(indexPath.row)
        tableView.reloadData()
    }
}

然而,在另一个 tableView 中,我设置了一个 UITableViewRowAction Edit 按钮,以便在单击时将用户带到 EditViewController,他们可以在其中编辑单元格。

UITableViewRowAction 代码:

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

    let editAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: " Edit    ") { (action , indexPath ) -> Void in
        self.editing = false

        self.performSegueWithIdentifier("edit", sender: self)

        print("Edit button pressed")
    }

    return [editAction]

}

我想要这个 EditViewController 中的一个按钮来删除单元格和单击单元格的核心数据信息,就像我在第一个 tableView 中所做的那样。在 EditViewController 中,我尝试使用与第一个 tableView 类似的代码...

var events = [Events]()

@IBAction func deleteButton(sender: AnyObject) {

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let moc = appDelegate.managedObjectContext

    moc.deleteObject(events[indexPath.row])
    appDelegate.saveContext()

    events.removeAtIndex(indexPath.row)

    navigationController?.popViewControllerAnimated(true)

}

但这不起作用,因为我无法访问我单击的单元格的 indexPath。无论如何,当我单击 UITableViewRowAction 编辑按钮时,我可以记录单元格的 indexPath 并在 EditViewController 中使用该信息吗?

第一步是将相关事件传递给EditViewController。首先,修改您的编辑操作闭包以获取相关事件并在 performSegueWithIdentifier 调用中传递它:

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

    let editAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: " Edit    ") { (action , indexPath ) -> Void in
        self.editing = false
        let eventToPass = events[indexPath.row]
        self.performSegueWithIdentifier("edit", sender: eventToPass)

        print("Edit button pressed")
    }
    return [editAction]    
}

然后实现prepareForSegue,它在你触发转场之后,转场实际发生之前被调用。这是将信息从第一个视图控制器传递到 segue 的目标视图控制器的地方:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "edit" {
        let editVC = segue.destinationViewController as! EditViewController
        editVC.eventToEdit = sender as! Events
    }
}

您需要将 eventToEdit 属性 添加到您的 EditViewController:

var eventToEdit : Events?

然后您应该可以使用此 属性 访问对象的各种属性,并且您的 deleteButton 代码可以删除此对象:

@IBAction func deleteButton(sender: AnyObject) {
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let moc = appDelegate.managedObjectContext
    moc.deleteObject(eventToEdit)
    appDelegate.saveContext()
    navigationController?.popViewControllerAnimated(true)
}

这应该会成功删除对象,但是您的 table 视图控制器将不会察觉。

第二步是确保 TVC 识别出对象已被删除。有几种方法可以实现这一点:

  1. 在 table 视图控制器中向 viewWillAppear 添加一些代码,它从 CoreData 重新加载事件数据并重新加载 table 视图。
  2. 用 Unwind Segue 替换 popViewController
  3. 实现一个 protocol/delegate 使 EditViewController 能够直接告诉 TVC 事件已被编辑或删除。
  4. 将您的 TVC 更改为使用 NSFetchedResultsController,它将观察 inserted/updated/deleted 事件并自动更新 table 视图。

我会先实施其中的第一个,然后在您更有信心时再试验其他的。