Swiftui: дочерний вид не получает обновлений для наблюдаемого объекта - PullRequest
1 голос
/ 20 марта 2020

У меня есть модель, которая, например, представляет собой облако тегов и модель для элементов:

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.

Как правильно создать этот отфильтрованный список с помощью выбора родительского представления и сделать список доступным в дочернем виде?

1 Ответ

1 голос
/ 21 марта 2020

Эта часть должна быть переосмыслена:

let tagCloud = TagCloud.tagCloud()
@ObservedObject var currentSelection : TaggedItem = TaggedItem()
                                       ^^ is a struct, it cannot be observed !!! 

@ObservedObject должен применяться только к @ObservableObject, как вы это делали для SelectedItems, поэтому, вероятно, еще один ObservableObject просмотр обертки модели вокруг TaggedItem здесь ожидается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...