【问题标题】:Persist changes to core data item from SwiftUI view从 SwiftUI 视图保持对核心数据项的更改
【发布时间】:2021-09-12 10:26:03
【问题描述】:

我正在开发一个 SwiftUI 应用程序,该应用程序将显示来自 Core Data 数据库的许多条目。基本上就是此类应用程序的 XCode 模板实现的内容。

我做了两个改变:

  1. 我将列表项视图的代码放入一个单独的文件中 (BookmarkableItemView)
  2. 我为项目添加了一个属性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
  • onChange on BookmarkableItemView for item.bookmarked 确实有效!!您可以将其写为答案,以便我投票和接受吗?
  • 我添加了它。我很高兴它成功了。

标签: swift core-data data-binding swiftui


【解决方案1】:

onDisappear 检查是否item.hasChanges

或在item.hasChanges上使用onChange

【讨论】:

  • 我实际上实现了 onChange 并且效果很好。
猜你喜欢
  • 2020-10-29
  • 1970-01-01
  • 2020-03-09
  • 2020-01-30
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
相关资源
最近更新 更多