就像在许多应用程序中一样,我有一个项目列表(由 Core Data 获取请求填充)、一个用于创建新项目的工作表,以及一个用于在点击列表中的一行时编辑项目的工作表。我正在尝试统一两个表单以创建和编辑更新,并将取消/保存逻辑放在表单的超级视图中。
所以我有这样的事情:
- ListView:由 Core Data 获取请求填充的行列表
- AddView:带有 FormView 嵌入 + 取消和保存按钮的 NavigationView
- EditView:带有 FormView 嵌入 + 取消和保存按钮的 NavigationView
- FormView:一个TextField,用于更新项目的名称
在 AddView 的 init() 中,我在没有任何上下文的情况下创建了一个新的 NSManagedObject(我这样做是因为我不希望在 AddView 中创建新项目时更新我的 ListView,但只有当我保存此项目时 - > 替代方法可能是使用子上下文,或根据返回对象的 isInserted 或 objectID.isTemporaryID 过滤获取请求结果)。AddView 包含一个带有 FormView 嵌入的 NavigationView、一个取消按钮和一个保存按钮。此保存按钮基于托管对象上的计算属性被禁用(对象名称不能为 nil)。
在 EditView 中,我传递了从 ListView 中点击的项目。此项目是附加到应用程序主 viewContext 的现有 NSManagedObject(来自 ListView 的获取请求)。EditView 包含一个带有 FormView 嵌入的 NavigationView、一个取消按钮和一个保存按钮(与 AddView 完全相同)。基于相同的计算属性,此保存按钮也被禁用。
我的问题是,当我从 FormView 中的 TextField 更新项目名称时,启用/禁用保存按钮的条件不适用于 AddView(当我从 FormView 更改项目名称时,此 AddView 实际上没有刷新) 但适用于 EditView(当我从 FormView 更改项目名称时,此 EditView 会刷新)。如果我在 AddView 的 init() 中将上下文附加到新的 NSManagedObject,则条件就像在 EditView 中一样。
因此,SwiftUI 似乎没有观察到没有任何上下文的 NSManagedObject?我错过了什么还是这是一个错误?