观察到的对象被无意中解雇了 SwiftUI

Observed Object gets Dismissed Unintentionally SwiftUI

我在具有以下设计的 NavigationView 中有一个 HStack:

  1. 用户可以滚动,然后点击 HStack 列表中的项目以查看详细信息
  2. 在详细视图中,用户可以select 项目
  3. 如果项目是 selected,我将 selected 项目的新视图放在 HStack 的顶部,因此只有 selected 项目可见
  4. 我想保留原始 HStack 并在新视图下方列出,以便用户可以反转流程而不丢失滚动位置

我已经使用一些测试数据完成了此操作并且它按预期工作,但是当我使用来自 Firebase 调用的数据时,原始 HStack/List 视图在新的“selected”视图时被关闭放在最上面...我不明白为什么。我认为这可能与观察对象的启动方式有关。感谢您的帮助!

struct TestView: View {
@StateObject var selectedItem = SelectedItem()

//Real Query
@ObservedObject var query = Query()

@ObservedObject var testQuery = TestQuery()

var body: some View {
    VStack{
        ZStack{
            ScrollView(.horizontal) {
                HStack(spacing: 35) {

                    //ForEach(query.queriedList) doesn't work, however the below does...

                    ForEach(testQuery.testList) { menuItems in
                        NavigationLink(
                            destination: NewDetailView(selectedItem: selectedItem, weeklyItems: weeklyItems, menuItem: menuItems)) {
                            MenuItemView(menuItem: menuItems)
                                .padding([.leading, .trailing])
                        }
                    }
                }
            }
            //if the array is NOT empty
            if selectedItem.selection.isEmpty == false {
                
                //PUT THIS ON TOP
                ScrollView(.horizontal) {
                    NavigationLink(
                        destination: NewDetailView(selectedItem: selectedItem, weeklyItems: weeklyItems, menuItem: self.selectedItem.selection[0], isSelected: true)) {
                            MenuItemView(menuItem: self.selectedItem.selection[0])
                            .padding([.leading, .trailing])
                    }
                }
            }
        }
    }
}

测试查询是什么样的

class TestQuery: ObservableObject {

@Published var testList: [MenuItem] = [.init(title: "Ham & Eggs", prepTime: 5, cookTime: 5, rating: 2, lastUsed: 13), .init(title: "Hot Totters", prepTime: 5, cookTime: 5, rating: 2, lastUsed: 13), .init(title: "Ranch Dressing Soup", prepTime: 5, cookTime: 5, rating: 2, lastUsed: 13)]
}

Firebase 查询

class Query: ObservableObject {

@Published var queriedList: [MenuItem] = []

init() {
    baseQuery()
}

func baseQuery() {
  let queryRef1 = Firestore.firestore().collection("menuItems").limit(to: 50)
    print("base fired")
    queryRef1
        .getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            self.queriedList = querySnapshot?.documents.compactMap { document in
                try? document.data(as: MenuItem.self)
                
            } ?? []
        }
    }
}

在 SwiftUI 视图中创建 ObservableObject 的唯一安全方法是使用

@StateObject

将两个 ObservedObjects 切换为 StateObjects

https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app