如何在 tableview 控制器中显示 CloudKit RecordType 实例

Posted

技术标签:

【中文标题】如何在 tableview 控制器中显示 CloudKit RecordType 实例【英文标题】:How to display CloudKit RecordType instances in a tableview controller 【发布时间】:2016-05-31 23:31:49 【问题描述】:

据我所知,以下代码(或非常接近的代码)将从 recordtype 数组中检索一个 cloudkit 实例...

    let pred = NSPredicate(value: true)

    let query = CKQuery(recordType: "Stores", predicate: pred)

    publicDatabase.performQuery(query, inZoneWithID: nil)  (result, error) in

        if error != nil
        
            print("Error" + (error?.localizedDescription)!)
        
        else
        
            if result?.count > 0
            
                let record = result![0]

                dispatch_async(dispatch_get_main_queue(),  () -> Void in

                    self.txtDesc.text = record.objectForKey("storeDesc") as? String
                    self.position = record.objectForKey("storeLocation") as! CLLocation
                    let img = record.objectForKey("storeImage") as! CKAsset
                    self.storeImage.image = UIImage(contentsOfFile: img.fileURL.path!)
....(& so on)

但是,我将如何以及何时(代码中的物理位置?)进行查询,以便我可以将每个单元格设置为我的 DiningType 记录中每个实例的信息?

例如,我会在 didreceivememory 警告函数中进行查询吗?或在cellforRowatIndexPath 中?或其他!

如果我对上面的代码有误解,请在注释中记下来,此时所有的帮助都是有价值的,非常感谢。

【问题讨论】:

您的网点连接正确吗?如果您没有实现此代码,您可以更改它们吗?如果是这样,只需添加 self.tableView.reloadData()。您正在实现异步代码,您的 tableView 在结果返回之前默认加载。 从哪里开始 - 我发布的代码取自教程(youtube.com/watch?v=J9BJijpVkyE)l 我关注了。不幸的是,教程允许我输入一个名称,而不是简单地从 icloud 下载所有信息已经定义了实例并下载实例的剩余数据。然而,这一切都在它自己的“搜索”UIButton中。所以我主要想知道我将在哪里输入我的谓词/查询/记录代码以便能够创建一个包含该信息的表格。 appcoda.com/cloudkit-introduction-tutorial - 假设我可以完成从 swift 到 swift 2 的转换,我会看看这个并回过头来回答我自己的问题。 【参考方案1】:

在没有更多信息的情况下,我将对其余未显示的代码做一些假设。我会假设:

您正在使用 UITableView 来显示您的数据 您的 UITableView (tableView) 已正确连接到您的 viewController,包括适当的 Outlet,并将 tableViewDataSource 和 tableViewDelegate 分配给您的视图,并实现这些协议所需的方法。 您的数据(对于每个单元格)存储在某种类型的集合中,例如数组(尽管有很多选项)。

当您调用代码从数据库(在本例中为 CloudKit)检索记录时,数据最终应该存储在您的数组中。当您的 Array 发生变化(新的或更新的数据)时,您会调用 tableView.reloadData() 来告诉 tableView 发生了一些变化并重新加载单元格。

在 tableView(:cellForRowAtIndexPath:) 中(手动)连接单元格。它为每个项目调用此方法(前提是您实现了 tableView(:numberOfRowsInSection:) 和 numberOfSectionsInTableView(_:)

如果您不熟悉 UITableView 的使用,一开始它们可能看起来很困难。如果您想看一个连接 UITableView 的简单示例,请告诉我!

【讨论】:

欣赏!在大多数情况下,您都在现场;我有一个表格视图来显示 cloudkit 数据。看起来我需要一个获取函数以及 tableview 函数。现在,用户和我都将对记录类型进行任何附加,那么仍然需要 reloaddata 函数吗?另外,您建议我将空数组放置在哪里以供未来的 cloudkit 数据使用? 保存数据的数组可以在任何地方,只要它在您需要调用它的范围内。通常,您将其视为类参数(在包含 tableview 的视图/类的定义内,但在任何函数之外。如果在 tableView 初始化后数据发生更改,则只需调用 reloadData() 。因此,如果设置了数组在 tableview 显示之前,您不需要调用它,否则您需要调用它。由于您的数据来自 CloudKit,我假设您需要在获取数据后重新加载 tableview? 虽然我们有很多概念在这里工作,即使我已经获取了数据,我仍然需要重新加载 tableview 才能显示数组? 当 tableView 初始化时,它会调用 dataSource 方法来找出从哪里获取它的数据(这基本上是 reloadData() 所做的)。如果初始化tableview时数据已经存在,它将显示它。如果之后更改数据(或需要从数据库中加载),则必须告诉 tableview 显示新数据('reloadData()')【参考方案2】:

首先,我必须处理典型的 cloudkit 要求:设置容器、公共数据库、谓词和查询输入。然后,我让公共数据库执行查询,在本例中,记录类型为“DiningType”。通过程序的第一个 if 语句,如果发现错误,控制台将打印“Error”并结束进一步的操作。但是,如果没有发现运行时问题,则发现与查询相关的每个结果都将附加到在 viewdidload 函数上方创建的类别数组中。

var categories: Array<CKRecord> = []

override func viewDidLoad() 
    super.viewDidLoad()


    func fetchdiningtypes()
    

        let container = CKContainer.defaultContainer()
        let publicDatabase = container.publicCloudDatabase
        let predicate = NSPredicate(value: true)
        let query = CKQuery(recordType: "DiningType", predicate: predicate)


        publicDatabase.performQuery(query, inZoneWithID: nil)  (results, error) -> Void in
            if error != nil
            
                print("Error")
            
            else
            
                for result in results!
                
                    self.categories.append(result)
                

                NSOperationQueue.mainQueue().addOperationWithBlock(  () -> Void in
                    self.tableView.reloadData()


                )
            
        

    

    fetchdiningtypes()

【讨论】:

纯代码的答案是不受欢迎的。请更新您的答案,以包含有关问题所在以及您的答案如何解决问题的详细信息。如果您实际上只是为您的问题提供了更多信息,请删除此“答案”并使用相关详细信息编辑您的问题。

以上是关于如何在 tableview 控制器中显示 CloudKit RecordType 实例的主要内容,如果未能解决你的问题,请参考以下文章

如何按下 tableview 单元格以在导航控制器中显示带有文本的视图控制器

用户在 UIImageView 中绘制内容后,如何将绘图保存在 tableview 中?

导航控制器未显示在 TableView 中

单击tableview标题按钮时如何将tableviewcell内的collectionview中的数据显示到另一个视图控制器

如何在 tableview 中为图像设置动画以同时扩展和打开另一个视图控制器?

Tableview 行没有在 swift 中显示带有附加值的顺序