【问题标题】:SwiftUI Loading DataSwiftUI 加载数据
【发布时间】:2021-12-26 07:59:28
【问题描述】:

当我呈现 SwiftUI 视图时,我试图从 ObservableObject 类加载数据,但 我收到以下错误代码:“无法在属性初始化程序中使用实例成员 'documentID';属性初始化程序在 'self' 之前运行可用”

数据查询类:

class ItemDataDelegate: ObservableObject {
    @Published var serviceContentLoaded = Bool()
    @Published var SelectedCategory: String?
    @Published var SelectedDocumentID: String?
    
    init(SelectedCategory: String, SelectedDocumentID: String){
        self.getSelectedContentData(Category: SelectedCategory, DocumentID: SelectedDocumentID) {
            self.getSelectedCompanyData(CUID: ContentData[indexPath.row].CompanyID) {
                print("data query completed")
            }
        }
    }
}

这是我在调用和完成之前代码中的数据时想要呈现的视图:

我上面提到的错误显示在@StateObject var itemDataDelegate = ItemDataDelegate(SelectedCategory: selectedCategory, SelectedDocumentID: documentID) 代码行。

struct DetailView: View {
    @Binding var documentID: String
    @Binding var selectedCategory: String
    @StateObject var itemDataDelegate = ItemDataDelegate(SelectedCategory: selectedCategory, SelectedDocumentID: documentID)
    @State private var showSheet = false
    @Environment(\.presentationMode) var mode: Binding<PresentationMode>
    
    var image: UIImage
    var companyName: String
    var cartActive: Bool
    
    var body: some View {
        return ZStack {
            switch itemDataDelegate.serviceContentLoaded {
                case true:
                    ContentView()
                case false:
                    LoadingView()
            }
        }
        .navigationBarHidden(true)
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .edgesIgnoringSafeArea(.all)
    }
}

【问题讨论】:

  • 在父视图中创建对象并注入它。
  • 您似乎遇到了stackoverflow thread 中提到的类似问题。可以试试accepted answer中提到的答案吗?
  • @Prabir 是的,您的答案与下面发布的 jnpdx 具有相同的解决方案。也谢谢你!

标签: swift swiftui


【解决方案1】:

由于您需要在@StateObject 的初始化中使用传入参数之一,因此您必须为您的View 编写一个自定义init。使用您当前的代码,它看起来像这样:

struct DetailView: View {
    @Binding var documentID: String
    @Binding var selectedCategory: String
    @StateObject var itemDataDelegate : ItemDataDelegate
    @State private var showSheet = false
    @Environment(\.presentationMode) var mode: Binding<PresentationMode>
    
    var image: UIImage
    var companyName: String
    var cartActive: Bool
    
    init(documentID: Binding<String>, selectedCategory: Binding<String>, image: UIImage, companyName: String, cartActive: Bool) {
        _documentID = documentID
        _selectedCategory = selectedCategory
        self.image = image
        self.companyName = companyName
        self.cartActive = cartActive
        _itemDataDelegate = StateObject(wrappedValue: ItemDataDelegate(SelectedCategory: selectedCategory.wrappedValue, SelectedDocumentID: documentID.wrappedValue))
    }
    
    var body: some View {
        return ZStack {
            switch itemDataDelegate.serviceContentLoaded {
                case true:
                    ContentView()
                case false:
                    LoadingView()
            }
        }
        .navigationBarHidden(true)
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .edgesIgnoringSafeArea(.all)
    }
}

【讨论】:

  • 你太棒了。非常感谢?
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多