如何在 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 识别出对象已被删除。有几种方法可以实现这一点:
- 在 table 视图控制器中向
viewWillAppear
添加一些代码,它从 CoreData 重新加载事件数据并重新加载 table 视图。
- 用 Unwind Segue 替换
popViewController
。
- 实现一个 protocol/delegate 使 EditViewController 能够直接告诉 TVC 事件已被编辑或删除。
- 将您的 TVC 更改为使用
NSFetchedResultsController
,它将观察 inserted/updated/deleted 事件并自动更新 table 视图。
我会先实施其中的第一个,然后在您更有信心时再试验其他的。
首先,我只想说我是 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 识别出对象已被删除。有几种方法可以实现这一点:
- 在 table 视图控制器中向
viewWillAppear
添加一些代码,它从 CoreData 重新加载事件数据并重新加载 table 视图。 - 用 Unwind Segue 替换
popViewController
。 - 实现一个 protocol/delegate 使 EditViewController 能够直接告诉 TVC 事件已被编辑或删除。
- 将您的 TVC 更改为使用
NSFetchedResultsController
,它将观察 inserted/updated/deleted 事件并自动更新 table 视图。
我会先实施其中的第一个,然后在您更有信心时再试验其他的。