这是我的场景......点击右上角(导航栏)的加号按钮,会出现带文本字段的警报视图,我在文本字段中添加一些数据,然后按确定按钮。这会导致textfield中的数据显示在tableview上,并且它也存储在core-data中。
然后,当我点击现在包含来自alertview文本字段的数据的那一行时,我会转到另一个要编辑的视图。此viewcontroller
的文本字段具有上一屏幕行的值。现在我点击文本字段并编辑其上的值,然后按右上角的保存。现在,理想情况下,当我按下保存并转到上一个屏幕时,现在应该在tableview上看到编辑的值而不是旧值。
但是发生的事情是当我按下保存并返回上一个屏幕时,我暂时会看到tableviewcontroller
中的更新值。但实际上,这个值在核心数据中加了两次,当我从这个tableview
返回到另一个视图并返回到它时,我不仅看到了编辑前的值,还看到了新编辑的值被添加两次!我无法理解这种行为......
单击编辑屏幕中的“保存”按钮,这就是我正在做的...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "save" {
editedModel = editTextField.text
}
}
回到桌面视图屏幕后,这就是我正在做的...(在tableviewcontroller
屏幕中)
@IBAction func saveToMainEditViewController (segue:UIStoryboardSegue) {
let detailViewController = segue.source as! EditCategoriesTableViewController
let index = detailViewController.index
let modelString = detailViewController.editedModel //Edited model has the edited string
let myCategory1 = Category(context: self.context)
myCategory1.categoryName = modelString
mangObjArr[index!] = myCategory1
//Saving to CoreData
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext = appDelegate.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "Category", in: managedContext)
let category = NSManagedObject(entity: entity!, insertInto: managedContext)
category.setValue(myCategory1.categoryName, forKeyPath: "categoryName")
category.setValue(myCategory1.categoryId, forKey: "categoryId")
do {
try managedContext.save()
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
categoryTableView.reloadData()
}
在cellForRowAtIndexPath中,这就是我正在做的......
let cell = tableView.dequeueReusableCell(withIdentifier: "categoryCell", for: indexPath)
let person = mangObjArr[indexPath.row]
cell.textLabel?.text = person.categoryName
return cell
答案 0 :(得分:0)
您正在插入新记录而不是更新以前的记录
在对Category实体进行任何插入之前,编写一段代码以获取具有当前名称的记录,然后将其当前名称替换为已编辑的字符串,然后保存。
此代码获取具有旧名称的记录,并将其名称替换为新名称
let fetchRequest : NSFetchRequest<Category> = Category.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "(categoryName == %@)", argumentArray: [*Your current categoryName*])
do {
let result = try managedContext.fetch(fetchRequest)
if let toBeUpdatedRecord = result.first
{
toBeUpdatedRecord.categoryName = newName
//here you should save
}
} catch{}