如何在 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标题按钮时如何将tableviewcell内的collectionview中的数据显示到另一个视图控制器