我很擅长使用Parse,我正在建立一个todo列表作为CRM的一部分。表视图中的每个任务都显示描述,截止日期和客户端名称。描述和截止日期在我的Task类中,以及指向Deal类的指针。客户端是Deal类中的字符串。我能够正确查询描述和截止日期,但我无法使用includeKey
从Deal对象中检索客户端属性。我按照includeKey
的Parse文档进行了操作。
描述和截止日期在结果表视图中正确显示,但不在客户端显示。日志显示client label: nil
,打印的任务详细信息包括<Deal: 0x7ff033d1ed40, objectId: HffKOiJrTq>
,但不包含客户端属性。 如何在表格视图中检索指针对象的属性(客户端)并将其指定给我的标签?我的相关代码如下。提前谢谢。
修改:我已根据此SO answer使用func fetchClients()
更新了我的代码,但我仍不确定我的功能是否完整或在何处调用。
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
}
}
答案 0 :(得分:3)
如果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? String
。