简体   繁体   中英

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

I'm trying to populate a table using PFQueryTableViewController. I want to use data from two class, which is Places and Details .

In Places , I have two column, which is placeText as string , and pointerToDetails as pointer.

In Details , I have one column, which is detailText .

I want to show the placeText and detailText in the same CustomCell which I already defined as PFTableViewCell .

Unfortunately, after I run the code, I only got the placeText inside the CustomCell .

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
    }
}

After I got an inspiration from @deadbeef (see answer 1), here is the solution I got :

  1. query.includeKey("pointerToDetails") is querying an object which can be accessed via object["pointerToDetails"] .

  2. to extract data from column detailText which already included in object["pointerToDetails"] , just do this :


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

here is the whole code :

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
    }
}

The detailtext property will not be included in your object as the includeKey() might suggest, but the Details object pointed by pointerToDetails will be queried along with you Places object.

So in order to get the value of detailText , you have to go through the pointer. In other words, try this :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM