【问题标题】:UITableView cells not populating with CloudKit dataUITableView 单元格未填充 CloudKit 数据
【发布时间】: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 的数据

感谢任何帮助!

【问题讨论】:

    标签: ios uitableview cloudkit


    【解决方案1】:

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

    tableView.addSubview(allColorsView)
    

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

    cell.addSubview(allColorsView)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多