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以创建与所选标记匹配的项目的筛选列表
- 调用并设置列表(通过打印验证)
- 但是,数据永远不会“到达”子视图
通过父视图选择创建此筛选列表并使其在子视图中可用的正确方法是什么?应重新考虑此部分:
let tagCloud = TagCloud.tagCloud()
@ObservedObject var currentSelection : TaggedItem = TaggedItem()
^^ is a struct, it cannot be observed !!!
@ObservedObject
必须仅应用于@ObservedObject
,就像您对SelectedItems
所做的那样,因此这里可能需要另一个ObservedObject
查看模型包装器