UITableView 单元格未填充 CloudKit 数据

Posted

技术标签:

【中文标题】UITableView 单元格未填充 CloudKit 数据【英文标题】:UITableView cells not populating with CloudKit data 【发布时间】:2020-06-11 15:53:08 【问题描述】:

我有一个应用程序,它通过 CloudKit 保存一组 5 种随机生成的颜色。它们保存在字符串(列表)的字段类型下。我能够成功保存和检索颜色。

在我的应用程序中,我想在不同的行上显示带有颜色数组的每条记录。目前,检索数据时会显示正确的行数,但只有第一行具有颜色数组(下面的屏幕截图)。当我拉下桌子时,它会刷新行并显示已保存的不同颜色数组。

import UIKit
import CloudKit

class FavoritesController: UIViewController, UITableViewDataSource 

let paletteController = PaletteController()
    let favoritesTableView = UITableView()
    let reuseIdentifier = "favoritesCell"

    let privateDatabase = CKContainer.default().privateCloudDatabase
    var retrieveFavoritePalette: [CKRecord] = []

    override func viewDidLoad() 
        super.viewDidLoad()
        setupTableView()
        queryDatabase()
    

    func setupTableView() 
        favoritesTableView.dataSource = self
        favoritesTableView.delegate = self
        favoritesTableView.register(UITableViewCell.self, forCellReuseIdentifier: reuseIdentifier)

        let heightOfCells: CGFloat = 100
        favoritesTableView.rowHeight = heightOfCells


        view.addSubview(favoritesTableView)
        favoritesTableView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor)
    

    func queryDatabase() 
        let query = CKQuery(recordType: "Favorite", predicate: NSPredicate(value: true))
        privateDatabase.perform(query, inZoneWith: nil)  (records, error) in
            if error == nil 
                print("Record retrieved")

                for record in records! 
                    self.retrieveFavoritePalette.append(record)
                
             else 
                print("Record not retrieved: \(String(describing: error))")
            
            let sortedRecords = records?.sorted(by:  $0.creationDate! > $1.creationDate! )
            self.retrieveFavoritePalette = sortedRecords ?? []
            DispatchQueue.main.async 
                self.favoritesTableView.reloadData()
            
        
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

        return retrieveFavoritePalette.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath)
        let paletteRecord: CKRecord = retrieveFavoritePalette[indexPath.row]
        var individualColorView: [UIView] = []
//        print(paletteRecord.value(forKey: "FavoritePalette"))

        let line = paletteRecord.value(forKey: "FavoritePalette") as? [String] ?? []

     //Creates the individual boxes where the color goes
        for i in 0..<5 
            let xAxis = i * 20
            let individualView = UIView(frame: CGRect(x: xAxis, y: 0, width: 20, height: 80))
            individualColorView.append(individualView)
        

        for j in 0..<line.count 
            let allColorsView = individualColorView[j]

            print(individualColorView[j])
            allColorsView.backgroundColor = UIColor(hexString: line[j])

            tableView.addSubview(allColorsView)
        

        cell.selectionStyle = .none
        return cell
    

我尝试将 let paletteRecord...tableView.addSubview(allColorsView) 放入 TableViewCell 类中,但是当我无法弄清楚如何在没有 indexPath.row 的情况下在 let paletteRecord: CKRecord = retrieveFavoritePalette[indexPath.row] 中编译代码时,我陷入了困境。

print(paletteRecord.value(forKey: "FavoritePalette")) 的输出是Optional(&lt;__NSArrayM 0x6000039f98f0&gt;( BBBB88, CCC68D, EEDD99, EEC290, EEAA88 ))

这就是它目前的样子。我需要每一行显示保存到 CloudKit 的字符串数组。

保存到 CloudKit 的数据

感谢任何帮助!

【问题讨论】:

【参考方案1】:

我认为您的问题在这一行:

tableView.addSubview(allColorsView)

您正在将颜色框添加到 tableView,但您可能打算像这样将它们添加到单元格本身:

cell.addSubview(allColorsView)

【讨论】:

以上是关于UITableView 单元格未填充 CloudKit 数据的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 单元格未正确显示

UItableview 单元格未扩展以显示文本

uiTableview 单元格未显示在视图控制器中

选择的 UITableView 单元格未加载另一个视图

单元格未填充在表格内的第二个集合视图中

调整 TableView 大小时,Swift 3.0 表格单元格未填充