我对使用 Parse 还很陌生,我正在构建一个待办事项列表作为 CRM 的一部分。 TableView 中的每个任务都显示描述、截止日期和客户名称。描述和截止日期在我的 Task 类中,还有一个指向 Deal 类的指针。 Client 是 Deal 类中的一个字符串。我能够正确查询描述和截止日期,但我无法使用 includeKey 从 Deal 对象中检索客户端属性。 .我遵循了 includeKey 的 Parse 文档.
描述和截止日期正确显示在生成的表格 View 中,但不会显示在客户端中。日志显示 client label: nil并且打印的任务详细信息包括 <Deal: 0x7ff033d1ed40, objectId: HffKOiJrTq> ,但与客户端属性无关。 如何检索指针对象的属性(客户端)并将其分配给 TableView 中的标签?我的相关代码如下。提前谢谢你。
编辑:我用 func fetchClients() 更新了我的代码基于此SO answer ,但我仍然不确定我的功能是否完整或在哪里调用它。
class TasksVC: UITableViewController {
var taskObjects:NSMutableArray! = NSMutableArray()
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
println("\(PFUser.currentUser())")
self.fetchAllObjects()
self.fetchClients()
}
func fetchAllObjects() {
var query:PFQuery = PFQuery(className: "Task")
query.whereKey("username", equalTo: PFUser.currentUser()!)
query.orderByAscending("dueDate")
query.addAscendingOrder("desc")
query.includeKey("deal")
query.findObjectsInBackgroundWithBlock { (tasks: [AnyObject]!, error:NSError!) -> Void in
if (error == nil) {
var temp:NSArray = tasks! as NSArray
self.taskObjects = temp.mutableCopy() as NSMutableArray
println(tasks)
self.tableView.reloadData()
} else {
println(error?.userInfo)
}
}
}
func fetchClients() {
var task:PFObject = PFObject(className: "Task")
var deal:PFObject = task["deal"] as PFObject
deal.fetchIfNeededInBackgroundWithBlock {
(deal: PFObject!, error: NSError!) -> Void in
let client = deal["client"] as NSString
}
}
//MARK: - Tasks table view
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.taskObjects.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("TaskCell", forIndexPath: indexPath) as TaskCell
var dateFormatter:NSDateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "M/dd/yy"
var task:PFObject = self.taskObjects.objectAtIndex(indexPath.row) as PFObject
cell.desc_Lbl?.text = task["desc"] as? String
cell.date_Lbl.text = dateFormatter.stringFromDate(task["dueDate"] as NSDate)
cell.client_Lbl?.text = task["client"] as? String
var clientLabel = cell.client_Lbl?.text
println("client label: \(clientLabel)")
return cell
}
}
请您参考如下方法:
如果 deal 列是一个指针,那么 includeKey("deal") 将获取该对象并为您填充它的属性。无需在此之上执行任何类型的 fetch。
不过你真的应该正确使用 Optionals:
if let deal = task["deal"] as? PFObject {
// deal column has data
if let client = deal["client"] as? String {
// client has data
cell.client_Lbl?.text = client
}
}
或者,您可以将最后一个 if let 替换为这样一行,它处理空值并使用默认值:
cell.client_Lbl?.text = (deal["client"] as? String) ?? ""
在您发布的 cellForRowAtIndexPath 代码中,您试图从任务而不是交易中读取客户端:task["client"] as?字符串.
