如何在 Swift 的不同视图控制器中更新同一实体的属性?

Posted

技术标签:

【中文标题】如何在 Swift 的不同视图控制器中更新同一实体的属性?【英文标题】:How can I update an attribute of the same entity in a different view controller in Swift? 【发布时间】:2021-05-19 05:48:13 【问题描述】:

我对使用 Core Data 非常陌生,不知道如何解决这个问题。我有两个视图控制器:视图控制器 A 和视图控制器 B。 在顶部我已经初始化:

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

我在 A 中创建了一个let newUser = User(context: self.context),然后继续填写:newUser.name = self.label.text。现在我想在视图控制器 B 中访问相同的用户对象以填写用户输入时的年龄。如何从视图控制器 B 中的核心数据访问相同的实体对象?

现在我将代码从视图控制器 A 复制并粘贴到视图控制器 B 中(例如实例化一个新用户并放入相同的上下文中),如下图所示在视图控制器 C 中(我正在输出两者),我正在成功检索姓名,但不是年龄:

class ViewControllerC: UIViewController 
var users: [User]?

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

func fetchDriverInfo()
    //fetch driver's information
    do 
         self.users = try context.fetch(User.fetchRequest())
         self.userName.text = self.users?[0].name        //works
         self.userAge.text =  self.users?[0].age        //doesn't work

   catch
        print("Something went wrong")
    

【问题讨论】:

修改记录后必须保存上下文。你怎么知道受影响的用户是第一个用户?除非您指定排序描述符,否则 Core Data 会无序获取记录。 是的,我已经保存了。我想我的问题是——每次我调用“新用户”时,它是否会创建一个新的用户实体并将其存储到用户数组中?我不知道为什么我假设上下文会指向同一个用户.. 我如何获得同一个用户? 如果您想获取特定用户,您必须将谓词应用于获取请求。 【参考方案1】:

可能的问题:

    有多个 User 实体,您正在保存一个,然后从另一个读取。 您没有正确写入或保存属性。 age 属性可能存在类型不匹配,并且在写入时出错。看起来您正在读取和写入 viewContext 并且没有其他上下文,您不应该需要保存上下文以查看对它的更改(但这是一个很好的做法),但是如果你用另一个上下文写的,它必须被保存。 您在错误的时间提取。该对象可能会在您进行提取后更新,并且存在一些微妙的时间问题。我通常建议使用 FetchedResultsController 甚至只访问和单个 ManagedObject。我不喜欢直接获取核心数据。处理指向 ManagedObjects 的指针可能很困难。它们被删除后您将无法访问它们,并且它们可能会在您不希望它们更新时进行更新。

如果没有看到写入核心数据的代码,很难确切知道问题所在。

【讨论】:

以上是关于如何在 Swift 的不同视图控制器中更新同一实体的属性?的主要内容,如果未能解决你的问题,请参考以下文章

在同一个视图控制器中使用 2 个表视图(swift 3)

如何在同一个视图控制器上分割文本字段(swift 3)

Swift - 如何实现默认视图控制器循环

Swift - 保存核心数据后更新 Tableview

Swift3.2 - 如何将 2 个类分配给同一个视图控制器?

Swift如何更新先前视图控制器中的标签