Search code examples
iosswiftparse-platformpfquery

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

Solution

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