无法将 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