Swiftui:子视图不接收对ObserveObject的更新

Swiftui:子视图不接收对ObserveObject的更新,swiftui,Swiftui,为了举例,我有一个模型,它是一个标记云和一个项目模型: struct TagCloud: Identifiable, Hashable{ var id: Int let tag: String static func tagCloud() -> [TagCloud]{ return [ TagCloud(id: 01, tag:"Green"), TagCloud(id: 02, tag:"Blue"), TagCloud(i

为了举例,我有一个模型,它是一个标记云和一个项目模型:

struct TagCloud: Identifiable, Hashable{
  var id: Int
  let tag: String

  static func tagCloud() -> [TagCloud]{
   return [ TagCloud(id: 01, tag:"Green"),
           TagCloud(id: 02, tag:"Blue"),
           TagCloud(id: 03, tag:"Red")]
  }
}

struct TaggedItem: Identifiable, Hashable{
  var id: Int
  let tag: String
  let item: String

  static func taggedItems() -> [TaggedItem]{
   return [ TaggedItem(id: 01, tag:"Green", item: "Tree"),
           TaggedItem(id: 02, tag:"Blue", item: "Sky"),
           TaggedItem(id: 03, tag:"Red", item: "Apple")...]
  }
}
我有一个类“包含”当前选定的项目:

class SelectedItems: ObservableObject {

 @Published var currentlySelectedItems:[TaggedItem]  = []

 func changeData(forTag tag: String ){
  let currentSelection = TaggedItem. taggedItems()
  let filteredList = cardCollection.filter { $0.tag == tag }
  currentlySelectedItems = filteredList
 }
}
在我的父视图中,我从云中选择一个标记:

struct ParentView: View {

 let tagCloud = TagCloud.tagCloud()
 @ObservedObject var currentSelection : TaggedItem = TaggedItem()
 @State var navigationTag:Int? = nil

  var body: some View {
   NavigationLink(destination: ChildView(), tag: 1, selection: $tag) {
    EmptyView()
   }

   VStack{
    ScrollView(.horizontal, content: {
     HStack(spacing: 20){
      ForEach( self.tagCloud, id: \.self) { item in
       VStack{
        Button(action: {
         self. currentSelection.changeData(forTag: item.tag )
         self.navigationTag = 1
        }){
         Text(item.tag)
        }.buttonStyle(PlainButtonStyle())
  ..  
}
子视图包含ObservedObject。作为旁注,我还将其设置为EnvironmentObject

struct ChildView: View {

 @ObservedObject var currentItems : SelectedItems = SelectedItems()

 var body: some View {
  VStack{
   ScrollView(.horizontal, content: {
    HStack(spacing: 20){
     ForEach( currentItems.currentlySelectedItems, id: \.self) { item in
...
问题是:

  • 在父视图中,该按钮调用SelectedItems以创建与所选标记匹配的项目的筛选列表
  • 调用并设置列表(通过打印验证)
  • 但是,数据永远不会“到达”子视图
我用init()尝试了许多方法。我尝试将所选标记传递给子级,然后在init()本身中进行过滤,但由于需要绑定到类而受阻。我在别处读到过,试图创建第二个模型,该模型将由第一个模型更新,以触发视图刷新


通过父视图选择创建此筛选列表并使其在子视图中可用的正确方法是什么?

应重新考虑此部分:

let tagCloud = TagCloud.tagCloud()
@ObservedObject var currentSelection : TaggedItem = TaggedItem()
                                       ^^ is a struct, it cannot be observed !!! 
@ObservedObject
必须仅应用于
@ObservedObject
,就像您对
SelectedItems
所做的那样,因此这里可能需要另一个
ObservedObject
查看模型包装器