首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表视图中没有显示Fi还原数据。可识别的设置不正确?

列表视图中没有显示Fi还原数据。可识别的设置不正确?
EN

Stack Overflow用户
提问于 2022-02-28 16:06:30
回答 1查看 47关注 0票数 0

我试图从firebase文档中获取一些数据,并将其显示在ListView中。获取数据并将其解码到我自己的结构中是很好的(通过让控制台打印它来测试),但是它不会出现在实际的ListView中。我尝试创建2个示例数据集,以查看我的struct和/或ListView的实现是否有问题,但这些数据集显示得很好。我最好的猜测是,ListView对我从firebase文档获得的id并不满意。

下面是我获取数据的方式(请忽略checkAvailablePkgs()中的丑陋解决方案,这将改变):

代码语言:javascript
复制
class firebaseController : ObservableObject {
    let databaseFIRB = Firestore.firestore()
    @Published var forUserAvailablePkgs : [DLPackage] = []
   
func checkAvailablePkgs() {
        if Auth.auth().currentUser != nil {
            var allAccessiblePkgs : [String] = []
            let userUID = Auth.auth().currentUser!.uid
            databaseFIRB.collection("user-access").document(userUID).getDocument { (document, error) in
                if let document = document, document.exists {
                    let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
                    let pkgArr = dataDescription.components(separatedBy: ", ")
                    for partString in pkgArr {
                        var tmpStringSlicing : String
                        tmpStringSlicing = partString.replacingOccurrences(of: "\": <null>", with: "")
                        tmpStringSlicing = tmpStringSlicing.replacingOccurrences(of: "[\\[\\]\"]", with: "", options: .regularExpression)
                        allAccessiblePkgs.append(tmpStringSlicing)
                    }
                    self.checkIndividualPkgInformation(pkgIDs: allAccessiblePkgs)
                } else {
                    print("Document does not exist")
                }
            }
        }
    }

    func checkIndividualPkgInformation(pkgIDs: [String]) {
        for id in pkgIDs {
            databaseFIRB.collection("download-pkgs").document(id).getDocument { (document, error) in
                if let document = document, document.exists {
                    let result = Result {
                        try document.data(as: DLPackage.self)
                    }
                    switch result {
                        case .success(let pkg):
                            if let pkg = pkg {
                                // A `Package` value was successfully initialized from the DocumentSnapshot.
                                print("Package: \(pkg)")
                                self.forUserAvailablePkgs.append(pkg)
                            } else {
                                // A nil value was successfully initialized from the DocumentSnapshot,
                                // or the DocumentSnapshot was nil.
                                print("Document does not exist")
                            }
                        case .failure(let error):
                            // A `City` value could not be initialized from the DocumentSnapshot.
                            print("Error decoding package: \(error)")
                        }
                } else {
                    print("Package-Document does not exist")
                }
            }
        }
    }
}

这是我想要将其保存为:

代码语言:javascript
复制
struct DLPackage: Identifiable, Codable {
    @DocumentID var id = UUID().uuidString
    var name : String = ""
    var size : String = ""
    var contentpaths : [String] = [""]
}

下面是拒绝显示所需数据的ListView:

代码语言:javascript
复制
struct FIRBauthView: View {
    let firebaseCtrl: firebaseController = firebaseController()
    var body: some View {
        VStack() {
            List(firebaseCtrl.forUserAvailablePkgs) {item in
                HStack() {
                    Text(String(item.name)).font(.custom("Avenir", size: 26))
                    Spacer()
                    Text(String(item.size)).font(.custom("Avenir", size: 26))
                }
            }
            Button {
                firebaseCtrl.checkAvailablePkgs()
            } label: {
                Text("Check")
            }
        }
    }
}

我可以给我的firebaseControler().forUserAvailablePkgs一个初始值为:

代码语言:javascript
复制
forUserAvailablePkgs.append(contentsOf: [DLPackage(name: "Example", size: "1GB", contentpaths: ["hello","something"]),DLPackage(name: "Nr2", size: "1GB", contentpaths: ["hello","something else"])])

他们会很好的出现。

这是我从加载到forUserAvailablePkgs数组的防火墙数据中打印出来的:

代码语言:javascript
复制
[Light_Player.DLPackage(_id: FirebaseFirestoreSwift.DocumentID<Swift.String>(value: Optional("CDB68E0C-DCE2-4FAA-AD55-872322A55E56")), name: "Example", size: "1GB", contentpaths: ["hello", "something"]), 
Light_Player.DLPackage(_id: FirebaseFirestoreSwift.DocumentID<Swift.String>(value: Optional("DCAAF136-24FE-470A-B897-2D178AEDB3A0")), name: "Nr2", size: "1GB", contentpaths: ["hello", "something else"]), 
Light_Player.DLPackage(_id: FirebaseFirestoreSwift.DocumentID<Swift.String>(value: Optional("package2")), name: "Bewährte Klassiker", size: "3.4GB", contentpaths: ["placeholder for another path", "placeholder for a different path"]), 
Light_Player.DLPackage(_id: FirebaseFirestoreSwift.DocumentID<Swift.String>(value: Optional("package1")), name: "Basic", size: "7.3GB", contentpaths: ["placeholder for path", "placeholder for path 2"])]

我尝试将结构的id更改为:

代码语言:javascript
复制
@DocumentID var id: String?

因为我在网上的一个教程中找到了它,但是代码并不是这样复制的。

在从数据库中获取数据之后,我还尝试用生成的UUID覆盖防火墙数据中的it,但仍然无法让ListView显示它。

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-01 08:59:03

好吧,在睡了一个好觉之后,我暂时的失明被治愈了,我发现在我看来,我错过了“观察对象”的属性。

代码语言:javascript
复制
struct FIRBauthView: View {
    @ObservedObject var firebaseCtrl: firebaseController = firebaseController()

而不是

代码语言:javascript
复制
struct FIRBauthView: View {
    let firebaseCtrl: firebaseController = firebaseController()

现在,数据正按预期显示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71297800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档