UITableView 行被删除后不会被删除

Posted

技术标签:

【中文标题】UITableView 行被删除后不会被删除【英文标题】:UITableView row won't removed after being deleted 【发布时间】:2016-08-08 13:18:17 【问题描述】:

我遇到的问题是,在我删除我的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)
      

【问题讨论】:

【参考方案1】:

您在保存删除之前重新加载表,因此您将获得一个仍然包含相同数据的重新加载表。保存后输入self.tableView.reloadData()

【讨论】:

【参考方案2】:

您还需要从数组中删除对象,然后在成功 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 检查教程的更多详细信息,它将帮助您。

Using NSFetchedResultsController to Display Data with Swift Core Data and Swift: NSFetchedResultsController

【讨论】:

它有一个错误“'NSFetchResultsController'类型的值没有成员'删除对象'。”

以上是关于UITableView 行被删除后不会被删除的主要内容,如果未能解决你的问题,请参考以下文章

[UITableView _endCellAnimationsWithContext:]

在后台删除的数据导致 UITableView 中的索引超出范围崩溃

如何减少/删除分组 UITableView 中的左/右手边距?

ios - UITableView 删除按钮不会对手势做出反应

CoreData 中的删除不会删除;重新启动后出现已删除的对象

删除 UITableView 中的行时出错