SwiftUI:当其他孩子更新父母时刷新子视图

问题描述

我有两个选项卡视图和它们的父视图。当 child1 更新我的父视图中的内容时,我希望刷新第二个孩子,这似乎不起作用。这是我的父视图代码

import SwiftUI

struct ContentView: View {

   @StateObject var collectionContainer = CollectionContainer()
   @State private var trashIndex = -1

   @State var items: [CustomItem] = []
   @State var item: CustomItem = CustomItem(name: "",amount: -1)

   var trashProxy: Binding<ContentWrapper> {
       Binding<ContentWrapper>(
           get: {
               return self.collectionContainer.getTrash()
           },set: {
               self.collectionContainer.collections[trashIndex] = $0
               self.items = [$0.content[0]]
               self.item = $0.content[0]
           })
   }

   var body: some View {
       TabView {
           ExistingItemsView(collectionContainer: collectionContainer,trashWrapper: trashProxy)
           .navigationBarTitledisplayMode(.inline)
           .tabItem {
               Image(systemName: "tray")
               Text("Items")
           }
        
           RemovedItemsView(items: self.items,item: self.item)
           .navigationBarTitledisplayMode(.inline)
           .tabItem {
               Image(systemName: "trash")
               Text("Trash")
           }
       }
       .accentColor(.green)
       .onAppear {
           self.trashIndex = self.collectionContainer.getTrashIndex()
       }
   }
}

据我所知,trashProxy 的 setter(在 child1 aka ExistingItemView 更改 collectionContainer 之后调用;通过调试确认)更新 ContentView 的状态,从而触发刷新。这也应该刷新 RemovedItemsView,然后在更新状态下显示 itemsitem。不幸的是,情况并非如此,只有在 RemovedItemsView 中的 @State 更新后,通过切换分段控件才会出现更新的值。

这是我的 RemovedItemsView 代码

import SwiftUI

struct RemovedItemsView: View {
    
    @State private var displayStyle = 0
    let styles = ["Detailed","Total"]
    
    @State private var dummy = "" 
    
    let items: [CustomItem]
    let item: CustomItem
    
    var body: some View {
        NavigationView {
            vstack {
                Picker(selection: $displayStyle,label: Text("")) {
                    ForEach(0..<styles.count) { index in
                        Text(self.styles[index]).tag(index)
                    }
                }
                .pickerStyle(SegmentedPickerStyle())
                .padding(.trailing,90)
                .padding(.leading,90)
                
                if(displayStyle == 0)
                {
                    SegViewOne(items: items)
                }
                else if (displayStyle == 1)
                {
                    SegViewTwo(item: item)
                }
            }
        }
    }
}

struct SegViewOne : View {
    
    let items: [CustomItem]
    
    var body: some View {
        List {
            ForEach(Array(items.enumerated()),id: \.0) { i,item in
                Text("\(item.name): \(item.amount)")
            }
        }
    }
}

struct SegViewTwo : View {
    
    let item: CustomItem
    
    var body: some View {
        Form {
            if(item.amount > 0 )
            {
                Text("\(item.name): \(item.amount)")
            }
        }
    }
}

感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)