无法将 tableView.deleteRowsAtIndexPaths 与 coreData 一起使用

Posted

技术标签:

【中文标题】无法将 tableView.deleteRowsAtIndexPaths 与 coreData 一起使用【英文标题】:unable to use tableView.deleteRowsAtIndexPaths with coreData 【发布时间】:2016-12-27 09:18:15 【问题描述】:

我创建了一个员工列表并将其显示为tableView。选择删除操作时,用户应该能够删除员工。我在一个阵列上对其进行了测试,它正在工作,但是当我将它更改为核心数据时,它崩溃了。没有

self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)

应用似乎可以运行,但删除的行仍然存在,标签为空。(Without the name and title)

FavEmployeeViewController.swift

//MARK:- Table Functions
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int

    if searchController.active && searchController.searchBar.text != "" 
        return filteredEmployees.count
    
    //coredata
    return employeeStore.testCoreData.count


//MARK:- TEST coredata
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    // Create an instance of UITableViewCell, with default appearance
    let cell = tableView.dequeueReusableCellWithIdentifier("EmployeeCell", forIndexPath: indexPath) as! EmployeeCell
    cell.updateLabels()

    let item = employeeStore.testCoreData[indexPath.row]

    cell.nameLabel.text = item.valueForKey("name") as? String
    cell.jobPosition.text = item.valueForKey("title") as? String

    return cell




//MARK:- Edit bar Button
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) 
    // If the table view is asking to commit a delete command...
    if editingStyle == .Delete 
        let item = employeeStore.testCoreData[indexPath.row]
        let title = "Delete \(item.valueForKey("name") as! String)?"
        let message = "Are you sure you want to delete this item?"

        let ac = UIAlertController(title: title, message: message, preferredStyle: .ActionSheet)
        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
        ac.addAction(cancelAction)

        let deleteAction = UIAlertAction(title: "Delete", style: .Destructive,
                                         handler:  (action) -> Void in
                                            // Remove the item from the store
                                            debugPrint("index", indexPath.row)
                                            self.employeeStore.testremoveEmployee(indexPath.row)
                                            // Also remove that row from the table view with an animation
                                            self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
                                                                                            debugPrint("index", indexPath.row)
        )
        ac.addAction(deleteAction)

        // Present the alert controller
        presentViewController(ac, animated: true, completion: nil)
    


override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) 
    // Update the model
    employeeStore.moveEmployeeAtIndex(sourceIndexPath.row, toIndex: destinationIndexPath.row)

EmployeeStore.swift

import UIKit
import CoreData

class EmployeeStore 
    //MARK:-Coredata
    var testCoreData = [NSManagedObject]() //storing favs entities

...

//MARK:- Test delete coreData -> removeFavEmployee
func testremoveEmployee(index: Int) 
    debugPrint("testremoveEmployee")
    //retrieve from CoreData
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let employee = testCoreData[index]

    let _: NSError! = nil
    do 
        managedContext.deleteObject(employee)
        debugPrint("manage2delete")
        try managedContext.save()

     catch 
        print("error : \(error)")
    

【问题讨论】:

如果你点击(没有名字和标题),你应该可以看到错误的图像。 不要删除 tableView 行。删除数据源中的行并重新加载表数据。 在employeeStore.testCoreData.removeAtIndex(sourceIndexPath.row)之后添加这一行 【参考方案1】:

您还需要从 self.employeeStore 数组中删除您刚刚从 CoreData 中删除的对象,因此在从 CoreData 中删除对象后添加 self.employeeStore.remove(at: indexPath.row)

self.employeeStore.testremoveEmployee(indexPath.row)

// Also remove that object from Array
self.employeeStore. testcoreData.removeAtIndex(indexPath.row)

// Now remove that row from the table view with an animation
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)

【讨论】:

谢谢。它正在工作。问题是核心数据中的对象已删除,但数组中的对象仍然存在。 self.employeeStore.removeAtIndex(indexPath.row) 我将其更改为 // 同时从数组中删除该对象 self.employeeStore.testcoreData.removeAtIndex(indexPath.row) 以使其工作。 @xxmilcutexx 欢迎伙伴 :) n 已编辑答案 :)

以上是关于无法将 tableView.deleteRowsAtIndexPaths 与 coreData 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端

C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable

无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS

无法将 .json 文件从 CSV 下载到 JSON 转换并且无法将 JSON 转换为 CSV

无法将 ReactiveUI 添加到 NUnit 测试项目

“无法将图像数据写入路径” - Laravel 图像干预