У меня есть модель, которая, например, представляет собой облако тегов и модель для элементов:
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 (), но был заблокирован необходимостью привязки к классу. Я читал в другом месте, чтобы попытаться иметь вторую модель, которая будет обновлена моделью FIRST, чтобы вызвать представление refre sh.
Как правильно создать этот отфильтрованный список с помощью выбора родительского представления и сделать список доступным в дочернем виде?