我的核心数据中有一些数据,并在表格视图中显示。我想在单击单元格时更新tableview行。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as! ItemTableViewCell
cell.starImage.image = UIImage(named: "Gray star icon")
cell.selectionStyle = .none
let context = coreData.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Item")
do {
let result = try context.fetch(request)
let img = UIImage(named: "Gray star icon")
for data in result as! [NSManagedObject] {
let data = img!.pngData() as NSData?
data?.setValue(data, forKey: "starImage")
}
} catch {
print("Failed")
}
coreData.saveContext()
tableView.reloadData()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? ItemTableViewCell else {
return UITableViewCell()
}
cell.itemName.text = itemCategoryNameArray[indexPath.row]
cell.itemDescription.text = itemDescriptionArray[indexPath.row]
cell.itemCategory.text = itemCategoryTypeArray[indexPath.row]
cell.starImage.image = UIImage(data: itemStarArray[indexPath.row])
cell.profileImage.image = UIImage(data: itemImageArray[indexPath.row])
return cell
}
但是我遇到了类似:-
的错误由于未捕获的异常“ NSUnknownKeyException”而终止应用程序, 原因:'[ setValue:forUndefinedKey:]:此类不是键值 符合关键starImage的编码要求。'
答案 0 :(得分:0)
请合并您的变量名:循环中有两个不同的data
变量,这会引起混乱和错误
更好
for item in result as! [NSManagedObject] {
let data = img!.pngData() as? NSData
item.setValue(data, forKey: "starImage")
}
尽管如此,我还是建议使用更多特定类型的图像,并且仅创建一次图像
let request = NSFetchRequest<Item>(entityName: "Item")
do {
let result = try context.fetch(request)
let img = UIImage(named: "Gray star icon")
let data = img!.pngData() as? NSData
for item in result {
item.starImage = data
}
} catch {
print("Failed", error)
}
答案 1 :(得分:0)
尝试一下。在这里,我一次只添加了一次核心数据中的所有记录,然后在选择了Tableview单元之后,特定的选定数据将被更新并保存到核心数据中,并且单元图像还将进行门更新。
// GET DATA FROM CORE DATA...
func fetchData() {
let context = coreData.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Item")
do {
let result = try context.fetch(request)
managedObjects = result as! [NSManagedObject] //managedObjects is a global array for the table content
tableView!.reloadData()
} catch {
print("Failed")
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as! ItemTableViewCell
cell.starImage.image = UIImage(named: "Gray star icon")
cell.selectionStyle = .none
self.editData(with: self.managedObjects[indexPath.row], indexPath: indexPath)
}
func editData(with object: NSManagedObject, indexPath: IndexPath) {
let img = UIImage(named: "Gray star icon")
let data = img!.pngData() as NSData?
(object as! Item).starImage = data
coreData.saveContext()
managedObjects[indexPath.row] = object
}