【问题标题】:How to swipe to delete Core Data TableViewCell (with row action) in another ViewController in Swift 2如何在 Swift 2 的另一个 ViewController 中滑动删除 Core Data TableViewCell(带有行操作)
【发布时间】:2016-10-27 10:33:44
【问题描述】:

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

我的应用程序已设置好,以便我可以使用 Core Data 添加一个事件,然后 2 个 tableViews 将使用来自该事件的信息进行更新。我配置的第一个 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 编辑按钮,以便在单击时将用户带到 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 中使用该信息?

【问题讨论】:

  • 在你的 deleteButton 中使用 tag 属性并设置 indexpath.row ,或者创建 UIButton 的子类并在其中定义 indexpath 属性
  • 如果我正在创建 UIButton 的子类,我将如何定义单击的单元格的 indexPath。我不确定这将如何工作,你能举个例子吗?
  • 您能否确认:deleteButton 代码是在(第二个)表格视图控制器中,还是在您的编辑操作所指向的编辑视图控制器中?
  • 在编辑视图控制器中
  • 请问您能出示prepareForSegue 代码吗?

标签: ios uitableview core-data swift2 xcode7


【解决方案1】:

第一步是将相关事件传递给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 之后、segue 实际发生之前调用。这是将信息从第一个视图控制器传递到 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)
}

这应该会成功删除对象,但您的表格视图控制器将完全不知道。

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

  1. 将一些代码添加到表视图控制器中的viewWillAppear,它会从 CoreData 重新加载事件数据并重新加载表视图。
  2. 用 Unwind Segue 替换 popViewController
  3. 实现一个协议/委托,使 EditViewController 能够直接告诉 TVC 事件已被编辑或删除。
  4. 将您的 TVC 更改为使用 NSFetchedResultsController,它将观察插入/更新/删除事件并自动更新表格视图。

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

【讨论】:

  • 这正是我想要的。谢谢你。我最终使用了一个 Unwind Segue,它修复了运行良好的 tableView。
猜你喜欢
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多