带有firestore数组的tableview swift uikit

Posted

技术标签:

【中文标题】带有firestore数组的tableview swift uikit【英文标题】:tableview swift uikit with firestore array 【发布时间】:2021-09-21 05:40:37 【问题描述】:

您好,我在从字典的 firestore 数组创建表视图时遇到问题。

请注意,表格视图的第一个单元格是自定义单元格

对我来说,问题是因为 firestore 数组只有一个字典,正如您在此处看到的,它是数组 plantDataArray 的打印结果

print("PLANT DATA ARRAY: \(plantDataArray)")

我得到了这个

PLANT DATA ARRAY: [Pietribiasi.PlantData(plantId: "C3884CIP01", plantType: "CIP", actualStatus: "WASHING", actualRecipe: "22")]

这就是我从 firestore 获取数据并将它们放在 plantDataArray 上的方式

func loadPlantData() 
        db.collection("plantsData").whereField("plantId", isEqualTo: "C3884CIP01").getDocuments()  [self]
            querySnapshot, error in
            if let error = error 
                print("Error: \(error.localizedDescription)")
            else
                self.plantDataArray = querySnapshot!.documents.compactMap(PlantData(dictionaryPlantData: $0.data()) )
                DispatchQueue.main.async 
                    self.detailTableView.reloadData()
                
            
        
        

使用此功能后

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
       
        
        return plantDataArray.count
    

然后生成表格视图单元格

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        
        print("INDEX ROW: \(indexPath.row)")
        print("PLANT DATA ARRAY: \(plantDataArray)")
        let customCell = detailTableView.dequeueReusableCell(withIdentifier: MyDetailTableViewCell.identifier, for: indexPath) as! MyDetailTableViewCell
        customCell.selectionStyle = .none
        let cell = detailTableView.dequeueReusableCell(withIdentifier: "DetailDefaultCell", for: indexPath)
        
       
        switch indexPath.row 
        
        case 0:
            if plantDataArray[indexPath.row].plantType == "CIP"
                customCell.configure(imageName: "CIP")
             else if plantDataArray[indexPath.row].plantType == "PASTEURIZATION"
                customCell.configure(imageName: "PASTEURIZATION")
            
            return customCell
        case 1:
            cell.textLabel?.text = "Actual Status:"
            cell.detailTextLabel?.text = plantDataArray[indexPath.row].actualStatus
            cell.detailTextLabel?.textColor = UIColor.gray
            return cell
        default:
            return cell
        
    

但它只生成第一个单元格案例 0,因为 plantDataArray.count 为 1,那么我该如何解决这个问题?它接缝我必须计算字典元素而不是字典数组。还是我做错了什么?

【问题讨论】:

for doc in querySnapshot!.documents   对不起你的意思? 您是否要为plantDataArray 中的每个条目创建两个单元格?您目前在tableView(_:numberOfRowsInSection:) 中为每个条目指定一行。相反,您需要return plantDataArray.count * 2 我需要为 plantDataArray 中的每个条目创建一行,因此在这种情况下,将是植物类型(这个自定义单元格)的一行,植物 ID 的另一行,actualStatus 的另一行,actualRecipe 的另一行,除了第一个一个 PlantType 另一个不是自定义单元格,所以我获得了一个表格视图,其第一行与另一行不同,这是问题所在,因为我创建了第一行并返回,并且在数组中没有其他元素之后数数 【参考方案1】:

您希望从 Firestore 中检索到的 plantDataArray 中的每个键值对都有一行。目前,仅显示“plantType”而不显示其他内容。我认为这是预期的行为。 UITableView 的 Swift 文档。函数tableView(UITableView, numberOfRowsInSection: Int) -> Int 告诉数据源返回表视图给定部分的行数。在这种情况下,您将返回“plantDataArray.count”,在这种情况下为 1。这意味着 table view 只包含 1 行,这就是为什么 "switch indexPath.row" 只返回 case 0 的原因,因为视图中只有 1 行。

如果要在同一行中显示所有组件,则需要在 tableViewCell 中定义不同的属性。如果您希望数据显示在不同的行中,则需要指定确切的行数,即植物数据对象中的键数。

有关更多信息,您可以参考 *** case1 和 case2,其中讨论了与使用 firebase firestore 数据填充 tableview 相关的类似问题。

【讨论】:

@NicolaRigoni 发布了答案,有用吗?

以上是关于带有firestore数组的tableview swift uikit的主要内容,如果未能解决你的问题,请参考以下文章

Tableview 中的 Swift Firebase Firestore 数据

带有 Repository/Firestore 的 MVVM - 存储来自单个集合的不同查询数组的最佳位置在哪里?

我的tableview单元格上的组件不可见

尝试搜索 Firestore 并重新加载 tableview 时出现 SearchBar 问题

带有数组信息的 UIViewController 上的 TableView [关闭]

从 tableView 中的 Firestore 单元格读取数据后随机重新排序