在TableView(编辑之后)中更新条目并在TableView中显示的问题



这是我的场景...在右上角(导航栏)上单击一个加号按钮时,出现带有Textfield的AlertView,我在Textfield中添加了一些数据,然后按确定按钮。这导致TextField中的数据显示在TableView上,并且还存储在Core-DATA中。

然后,当我单击该行现在,该行现在从AlertView Textfield中获得数据时,我转到另一个用于编辑的视图。该viewcontroller具有一个文本字段,该文本字段具有从上一个屏幕的行中的值。现在,我单击Textfield并在其上编辑值,然后按在右上角保存。现在,理想情况下,当我按"保存"并转到上一个屏幕时,现在应该在tableview而不是旧值上看到编辑值。

但是发生的事情是当我按"保存"并返回上一个屏幕时,我暂时会看到tableviewcontroller中的更新值。但是实际上,该值在Core-Data中添加了两次,当我从此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

您正在插入新记录,而不是更新上一个记录
在对类别实体的任何插入之前,请编写一个用当前名称获取记录的代码,然后用编辑的字符串替换其当前名称,然后保存。
此代码以旧名称获取记录,然后用新名称替换其名称

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{}

最新更新