【问题标题】:Observed Object gets Dismissed Unintentionally SwiftUI观察到的对象无意中被解雇 SwiftUI
【发布时间】:2021-10-13 07:38:58
【问题描述】:

我在 NavigationView 中有一个 HStack,其设计如下:

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

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

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)
                
            } ?? []
        }
    }
}

【问题讨论】:

  • 将观察到的两个对象改为状态对象
  • 谢谢!很难相信我花了尽可能多的时间来努力解决这个问题。感谢您指出这一点。随意发布答案,我会接受。

标签: google-cloud-firestore swiftui observableobject


【解决方案1】:

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

@StateObject

将两个 ObservedObjects 切换为 StateObjects

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多