【问题标题】:Issue with updating entries in tableview (after editing)and showing in Tableview更新表格视图中的条目(编辑后)并在表格视图中显示的问题
【发布时间】:2017-09-23 09:50:20
【问题描述】:

这是我的场景...单击右上角(导航栏)的加号按钮,会出现一个带有文本字段的警报视图,我在文本字段中添加一些数据,然后按确定按钮。这会导致文本字段中的数据显示在 tableview 上,并且它也存储在 core-data 中。

然后,当我单击现在具有来自 alertview 文本字段的数据的那一行时,我会转到另一个用于编辑的视图。这个viewcontroller 有一个文本字段,其值来自上一屏幕的行。现在我单击文本字段并编辑其上的值,然后按右上角的保存。现在,理想情况下,当我按下保存并转到上一个屏幕时,现在应该在 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

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    您正在插入一条新记录,而不是更新前一条记录
    在对 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{}
    

    【讨论】:

    • 好的..@Athena...那么我在哪里包含这些行...?
    • 在这一行中 let result = try managedContext.fetch(fetchRequest),我得到的结果是 nil。任何想法..?
    • 您的 managedContext 对象是否正确启动?如果是这样,获取请求中的结果为 nil 可能意味着没有找到记录。
    • 打印 fetchRequest.predicate 确实给出了属性的所有值,包括类别名称的更新值,并且 managedContext 被初始化为 let context = (UIApplication.shared.delegate as!AppDelegate).persistentContainer.viewContext .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多