【问题标题】:How to display CloudKit RecordType instances in a tableview controller如何在 tableview 控制器中显示 CloudKit RecordType 实例
【发布时间】: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 的转换,我会看看这个并回过头来回答我自己的问题。

标签: swift tableview instance icloud cloudkit


【解决方案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()

【讨论】:

  • 纯代码的答案是不受欢迎的。请更新您的答案,以包含有关问题所在以及您的答案如何解决问题的详细信息。如果您实际上只是为您的问题提供了更多信息,请删除此“答案”并使用相关详细信息编辑您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多