【问题标题】:UITableView row won't removed after being deletedUITableView 行被删除后不会被删除
【发布时间】: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)
    }  
}

【问题讨论】:

    标签: swift tableview nsfetchedresultscontroller


    【解决方案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 检查教程的更多详细信息,它将帮助您。

      【讨论】:

      • 它有一个错误“'NSFetchResultsController'类型的值没有成员'删除对象'。”
      猜你喜欢
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2017-06-06
      • 2013-12-12
      • 1970-01-01
      相关资源
      最近更新 更多