从 SwiftUI 视图保存对核心数据项的更改
Persist changes to core data item from SwiftUI view
我正在开发一个 SwiftUI 应用程序,它可以显示来自 Core Data 数据库的多个条目。基本上就是这些应用程序的 XCode 模板实现的内容。
我做了两个更改:
- 我将列表项视图的代码放到一个单独的文件中 (
BookmarkableItemView
)
- 我在项目中添加了一个属性
bookmarked
,我称之为BookmarkableItem
我认为显示项目列表的代码现在是:
List(bookmarkableItems) { item in
BookmarkableItemView(item: item)
}
在 BookmarkableItemView
中,项目 属性 是一个 @ObservedObject
。
现在,我的 BookmarkableItemView
还包含一个按钮,可以切换视图所代表的项目上的 bookmarked
属性。一切都很好 - 这很容易。但现在我必须坚持改变...
我可以想到以下两种解决方案:
- 将一个动作(简单的
(BookmarkableItem) -> Void
)传递给 BookmarkableItemView
,然后在按下视图中的按钮时调用该动作
- 让视图本身保存托管对象上下文
后者在我看来是不行的。第一个解决方案有效。现在 BookmarkableItemView
中有一个 bookmarkAction
属性,所以上面的代码看起来像这样:
List(bookmarkableItems) { item in
BookmarkableItemView(bookmarkAction: { toggleBookmark(item) }, item: item)
}
该操作由 BookmarkableItemView
调用,因此调用了 toggleBookmark(_ item:)
方法。
但不知何故,我觉得我在 SwiftUI 中遗漏了一些可以简化流程的绑定?当子视图对数据模型执行更改时,如何让我的父视图收到通知,以便我可以保留它们?
onDisappear
检查是否 item.hasChanges
或在 item.hasChanges
上使用 onChange
我正在开发一个 SwiftUI 应用程序,它可以显示来自 Core Data 数据库的多个条目。基本上就是这些应用程序的 XCode 模板实现的内容。
我做了两个更改:
- 我将列表项视图的代码放到一个单独的文件中 (
BookmarkableItemView
) - 我在项目中添加了一个属性
bookmarked
,我称之为BookmarkableItem
我认为显示项目列表的代码现在是:
List(bookmarkableItems) { item in
BookmarkableItemView(item: item)
}
在 BookmarkableItemView
中,项目 属性 是一个 @ObservedObject
。
现在,我的 BookmarkableItemView
还包含一个按钮,可以切换视图所代表的项目上的 bookmarked
属性。一切都很好 - 这很容易。但现在我必须坚持改变...
我可以想到以下两种解决方案:
- 将一个动作(简单的
(BookmarkableItem) -> Void
)传递给BookmarkableItemView
,然后在按下视图中的按钮时调用该动作 - 让视图本身保存托管对象上下文
后者在我看来是不行的。第一个解决方案有效。现在 BookmarkableItemView
中有一个 bookmarkAction
属性,所以上面的代码看起来像这样:
List(bookmarkableItems) { item in
BookmarkableItemView(bookmarkAction: { toggleBookmark(item) }, item: item)
}
该操作由 BookmarkableItemView
调用,因此调用了 toggleBookmark(_ item:)
方法。
但不知何故,我觉得我在 SwiftUI 中遗漏了一些可以简化流程的绑定?当子视图对数据模型执行更改时,如何让我的父视图收到通知,以便我可以保留它们?
onDisappear
检查是否 item.hasChanges
或在 item.hasChanges
onChange