在 Parse.com 中,如何在 PFQueryTableViewController 中使用 query.includeKey 和 swift?

in Parse.com, how to use query.includeKey in PFQueryTableViewController with swift?

我正在尝试使用 PFQueryTableViewController 填充 table。 我想使用来自两个 class 的数据,即 PlacesDetails.

Places中,我有两列,placeText作为stringpointerToDetails作为指针。

Details中,我有一列,即detailText

我想在我已经定义为 PFTableViewCell.

的同一个 CustomCell 中显示 placeTextdetailText

不幸的是,在我运行代码之后,我只得到了CustomCell里面的placeText

import UIKit

class TableViewController: PFQueryTableViewController {

    // Initialise the PFQueryTable tableview
    override init!(style: UITableViewStyle, className: String!) {
        super.init(style: style, className: className)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // Configure the PFQueryTableView
        self.pullToRefreshEnabled = true
        self.paginationEnabled = false
    }

    // Define the query that will provide the data for the table view
    override func queryForTable() -> PFQuery! {

        var query = PFQuery(className: "Places")
        query.includeKey("pointerToDetails")
        return query
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject) -> PFTableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("CustomCell") as CustomTableViewCell!
        if cell == nil {
            cell = CustomTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CustomCell")
        }

        // Extract values from the PFObject to display in the table cell
        cell.name.text = object["placeText"] as String!
        cell.detail.text = object["detailText"] as String!

        return cell
    }
}

detailtext 属性 不会像 includeKey() 可能建议的那样包含在您的对象中,但 pointerToDetails 指向的 Details 对象将包含跟你一起查询Places对象。

所以要想得到detailText的值,就得通过指针。换句话说,试试这个:

cell.name.text = object["placeText"] as String!
cell.detail.text = object["pointerToDetails"]["detailText"] as String!

在我从@deadbeef 得到启发后(见答案 1),这是我得到的解决方案:

  1. query.includeKey("pointerToDetails") 正在查询可以通过 object["pointerToDetails"] 访问的对象。

  2. 要从 object["pointerToDetails"] 中已经包含的列 detailText 中提取数据,只需执行以下操作:


if let pointer = object["pointerToDetails"] as? PFObject {
     cell.detail.text = object["detailText"] as String!
}

这是完整的代码:

import UIKit

class TableViewController: PFQueryTableViewController {

    // Initialise the PFQueryTable tableview
    override init!(style: UITableViewStyle, className: String!) {
        super.init(style: style, className: className)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // Configure the PFQueryTableView
        self.pullToRefreshEnabled = true
        self.paginationEnabled = false
    }

    // Define the query that will provide the data for the table view
    override func queryForTable() -> PFQuery! {

        var query = PFQuery(className: "Places")
        query.includeKey("pointerToDetails")
        return query
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject) -> PFTableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("CustomCell") as CustomTableViewCell!
        if cell == nil {
            cell = CustomTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CustomCell")
        }

        // Extract values from the PFObject to display in the table cell
        cell.name.text = object["placeText"] as String!
        if let pointer = object["pointerToDetails"] as? PFObject {
            cell.detail.text = object["detailText"] as String!
        }
        return cell
    }
}