Swift3、CloudKit 和 UITableView 返回空白表

Posted

技术标签:

【中文标题】Swift3、CloudKit 和 UITableView 返回空白表【英文标题】:Swift3, CloudKit and UITableView returns blank table 【发布时间】:2017-02-22 09:57:54 【问题描述】:

我有一个小的心理障碍,我对 Core Data 很满意,并决定为我的一些应用程序深入研究 CloudKit,但是虽然上传方面相当基本,但我在填充一个简单的表格时遇到了麻烦查看。

CKRecord 是 Activity,我想显示的字段是名称。打印函数 print(actName) 返回 7 次,显示所有记录都已统计,但表格为空白且没有错误。

我确信这很简单,我只见树木不见森林,所以我很高兴能指出正确的方向。

干杯

import UIKit
import CloudKit

class TableViewController: UITableViewController 

    var activities = [Activity]()


    override func viewDidLoad() 
        super.viewDidLoad()



        tableView.delegate = self
        tableView.dataSource = self
    


    override func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        print("counted records")
        return activities.count

    


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let active = activities[indexPath.row]
        if let actName = active.name 

        cell.textLabel?.text = actName

            print(actName)

        
        return cell
    

【问题讨论】:

activities 数组中存储对象的位置。 尼拉夫,这是我的意图。我的 CK 记录类型是公共数据库中的活动。我不知道为什么我会返回“计数记录”而不是“actName”。 正如我所说,这是我第一次深入 CloudKit,并且我使用了一些用于我的 CoreData 应用程序的语法,这些应用程序可以完美运行。 activities数组中存储对象后是否重新加载tableView。您需要向我们展示您在活动数组中添加对象的代码。 嗨 Nirav,我有点迷失了。我假设,指定 CKRecord Activity,然后使用 Activity (name) 中的字段,我可以在表格行中显示名称。这就是我在 Core Data 中处理它的方式,不同之处在于指定持久容器 - let context = (UIApplication.shared.delegate as!AppDelegate).persistentContainer.viewContext 我想我缺少的是对容器的引用?这是对公共数据库的引用吗? 【参考方案1】:

我似乎已经解决了,user3069232,我不认为有/没有很大的延迟问题,因为更新代码是使用 CloudKit 桌面即时的。 Nirav,我认为您是对的,归结为不存储然后重新加载。我已经修改了我的原始代码,因为我认为“活动”也引起了问题,下面的脚本运行良好,感谢大家指出正确的方向。

import UIKit
import CloudKit

class CoursesVC: UIViewController, UITableViewDelegate, UITableViewDataSource 

    @IBOutlet weak var coursesTable: UITableView!


    var coursesArray: Array<CKRecord> = []

    var selectedCourseIndex: Int!

    override func viewDidLoad() 
        super.viewDidLoad()

        coursesTable.delegate = self
        coursesTable.dataSource = self
        fetchCourses()

    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "courseCell", for: indexPath)
        let courseRecord: CKRecord = coursesArray[indexPath.row]

        cell.textLabel?.text = courseRecord.value(forKey: "courseVenue") as? String

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd MMMM yyyy"

        let CSDate = dateFormatter.string(from: courseRecord.value(forKey: "courseDate") as! Date)
//        let CSDetail = courseRecord.value(forKey: "courseDetail") as? String
        cell.detailTextLabel?.text = CSDate

        return cell
    

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 40.0
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        selectedCourseIndex = indexPath.row
        performSegue(withIdentifier: "showMapDetail", sender: self)
   

    func fetchCourses() 
        let container = CKContainer.default()
        let publicDatabase = container.publicCloudDatabase
        let predicate = NSPredicate(format: "TRUEPREDICATE")

        let query = CKQuery(recordType: "Courses", predicate: predicate)
        query.sortDescriptors = [NSSortDescriptor(key: "courseDate", ascending: true)]

        publicDatabase.perform(query, inZoneWith: nil)  (results, error) -> Void in

            if error != nil 

                print("error fetch notes \(error)")

             else 

                print("Success")

                for result in results! 
                    self.coursesArray.append(result )
                

                OperationQueue.main.addOperation( () -> Void in
                    self.coursesTable.reloadData()
                    self.coursesTable.isHidden = false
                )
            
        
    


    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


【讨论】:

以上是关于Swift3、CloudKit 和 UITableView 返回空白表的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 使用 CKAsset 将图像发送到 CloudKit

Swift 3.0 CloudKit fetchDatabaseChangesCompletionBlock 错误

如何在 swift 3 中为 UITable 视图提供单元格缩进级别?

CloudKit 错误:更改令牌已过期,需要重置

使用 IOS9 时,无法在 UITable 的部分标题上的 UIButtons 上触发触摸事件(IOS10 很好)

在 CloudKit 中创建指向多个 CKRecord 的引用列表