【发布时间】:2021-09-12 10:26:03
【问题描述】:
我正在开发一个 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 -
onChangeonBookmarkableItemViewforitem.bookmarked确实有效!!您可以将其写为答案,以便我投票和接受吗? -
我添加了它。我很高兴它成功了。
标签: swift core-data data-binding swiftui