删除后 UITableView 行不会被删除
UITableView row won't removed after being deleted
我遇到了问题,在我删除 tableview
行之后,该行不会被删除,这是代码,我已经按照在线教程进行操作,它成功地从数据模型中删除了,但它不会关闭已删除的行,除非我返回到上一个屏幕并返回到此视图,这是为什么呢? :
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete) {
let product = frc.objectAtIndexPath(indexPath) as! Product
let productName = product.name
let message = (MCLocalization.sharedInstance.stringForKey("cart_remove_one_item_message", replacements: ["%s" : productName!]))
let alert = UIAlertController(title: (MCLocalization.sharedInstance.stringForKey("cart_remove_title")), message: message, preferredStyle: UIAlertControllerStyle.Alert)
let OKAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: {
(_)in
let managedObject : NSManagedObject = self.frc.objectAtIndexPath(indexPath) as! NSManagedObject
self.moc.deleteObject(managedObject)
self.tableView.reloadData()
do {
try self.moc.save()
} catch {
print("Failed to save.")
return
}
})
alert.addAction(OKAction)
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))
self.presentViewController(alert, animated: false, completion: nil)
}
}
您在保存删除之前重新加载 table,因此您重新加载的 table 仍然包含相同的数据。保存后放self.tableView.reloadData()
。
您还需要从数组中删除对象,然后在 moc.save()
成功后重新加载 tableView
。
let managedObject : NSManagedObject = self.frc.objectAtIndexPath(indexPath) as! NSManagedObject
self.moc.deleteObject(managedObject)
do {
try self.moc.save()
} catch {
print("Failed to save.")
return
}
编辑:
您需要在您使用 NSFetchedResultsController
的问题中添加它,现在我认为您已经使用 self.frc.delegate = self
设置了委托,然后添加此委托方法并删除 reloadData
没有现在需要那个。
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert:
tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Automatic)
case .Delete:
tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Automatic)
default: break
}
}
有关 NSFetchedResultsController 的更多详细信息,请查看教程,它将对您有所帮助。
我遇到了问题,在我删除 tableview
行之后,该行不会被删除,这是代码,我已经按照在线教程进行操作,它成功地从数据模型中删除了,但它不会关闭已删除的行,除非我返回到上一个屏幕并返回到此视图,这是为什么呢? :
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete) {
let product = frc.objectAtIndexPath(indexPath) as! Product
let productName = product.name
let message = (MCLocalization.sharedInstance.stringForKey("cart_remove_one_item_message", replacements: ["%s" : productName!]))
let alert = UIAlertController(title: (MCLocalization.sharedInstance.stringForKey("cart_remove_title")), message: message, preferredStyle: UIAlertControllerStyle.Alert)
let OKAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: {
(_)in
let managedObject : NSManagedObject = self.frc.objectAtIndexPath(indexPath) as! NSManagedObject
self.moc.deleteObject(managedObject)
self.tableView.reloadData()
do {
try self.moc.save()
} catch {
print("Failed to save.")
return
}
})
alert.addAction(OKAction)
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))
self.presentViewController(alert, animated: false, completion: nil)
}
}
您在保存删除之前重新加载 table,因此您重新加载的 table 仍然包含相同的数据。保存后放self.tableView.reloadData()
。
您还需要从数组中删除对象,然后在 moc.save()
成功后重新加载 tableView
。
let managedObject : NSManagedObject = self.frc.objectAtIndexPath(indexPath) as! NSManagedObject
self.moc.deleteObject(managedObject)
do {
try self.moc.save()
} catch {
print("Failed to save.")
return
}
编辑:
您需要在您使用 NSFetchedResultsController
的问题中添加它,现在我认为您已经使用 self.frc.delegate = self
设置了委托,然后添加此委托方法并删除 reloadData
没有现在需要那个。
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert:
tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Automatic)
case .Delete:
tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Automatic)
default: break
}
}
有关 NSFetchedResultsController 的更多详细信息,请查看教程,它将对您有所帮助。