Gugulethu
Gugulethu

Reputation: 1436

Querying parse for objects with a Pointer, swift

I'm trying to make a Query with a Pointer in Parse. I have two classes "Discover" and "DiscoveryDetails". I want to get the discovery details of an object that's picked from the discovery class.

Discovery Class enter image description here

DiscoveryDetails Class - with the discoverID as the pointer. enter image description here

The discovery objects are displayed in a DiscoveryTableView and on selecting one of the items, I want to query the objects of with an ID related to that selection in a DiscoveryDetailsTableView.

The DiscoveryTableView shows the objects as they appear in the class but the DiscoveryDetailsTableView shows all the objects instead of those related to the Cell I selected.

This is my didSelectRowAtIndexPath Code in the DiscoveryTableView:

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    tableView.deselectRowAtIndexPath(indexPath, animated: true)

                let mainStoryboard = UIStoryboard(name: "Discovery", bundle: nil)
                let discoveryDetailView = mainStoryboard.instantiateViewControllerWithIdentifier("discoveryDetailTVC") as! DiscoveryDetailTableViewController

                let object = self.objectAtIndexPath(indexPath)
                discoveryDetailView.titleString = object?.objectForKey("workoutName") as! String
                discoveryDetailView.describtionString = object?.objectForKey("workoutDetails") as! String
                discoveryDetailView.numberOfWorkouts = object?.objectForKey("numberOfWorkouts") as! Int
                discoveryDetailView.imageFile1 = object?.objectForKey("image1") as! PFFile
                discoveryDetailView.imageFile2 = object?.objectForKey("image2") as! PFFile
                discoveryDetailView.imageFile3 = object?.objectForKey("image3") as! PFFile

let row = indexPath.row //we know that sender is an NSIndexPath here.
            let selectedObj = objects![row] // some var where you hold your data
            discoveryDetailView.varInDDT = selectedObj


                self.navigationController?.pushViewController(discoveryDetailView, animated: true)

        }

In my DiscoveryDetailsTableView I have this code:

var titleString: String!
    var describtionString: String!
    var numberOfWorkouts: Int!
    var imageFile1: PFFile!
    var imageFile2: PFFile!
    var imageFile3: PFFile!
   var varInDDT : PFObject?

    //MARK: Query for Table with the details
override func queryForTable() -> PFQuery {

    let discoveryQuery = PFQuery(className: "DiscoveryDetails")
    discoveryQuery.cachePolicy = .CacheElseNetwork
    discoveryQuery.whereKey("discoveryID", equalTo: PFObject(withoutDataWithClassName: "Discovery", objectId: "\(varInDDT!.objectId!)"))
    discoveryQuery.orderByDescending("createdAt")
    return discoveryQuery

}

override func viewDidLoad() {
        super.viewDidLoad()

        //Header Display
        let imagesArray = [imageFile1, imageFile2, imageFile3]
        let imagePicked = randomIntergerInRange(0, high: imagesArray.count)

        titleLabel.text = titleString.uppercaseString
        self.subtitleLabel.text = describtionString
        self.numberOfWorkoutsLabel.text = "\(numberOfWorkouts!) Workouts"

        //Pick a random Image from the Images
        imagesArray[imagePicked].getDataInBackgroundWithBlock({ (imageData, error) -> Void in
            if error == nil
            {
                if let imageData = imageData
                {
                    let image = UIImage(data:imageData)
                    self.backgroundImage.image = image
                }
            }
        })

...

}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {

var discoveryDetailItemsCell:DiscoveryDetailTableViewCell! = tableView.dequeueReusableCellWithIdentifier("DiscoveryDetailTableViewCell") as? DiscoveryDetailTableViewCell

...

discoveryDetailItemsCell.titleLabel.text = object?.objectForKey("exerciseName") as? String
        discoveryDetailItemsCell.titleLabel.textColor = UIColor.whiteColor()

        discoveryDetailItemsCell.durationAndSetsLabel.text = "\((object?.objectForKey("durationOrSets"))!)"
        discoveryDetailItemsCell.minAndSetLabel.text = "mins"


...

return discoveryDetailItemsCell

}

There may be similar questions out there but I have not found anything that answers this or I am probably not seeing my mistake clearly.

Thanks for the help in advance. :)

Upvotes: 0

Views: 259

Answers (1)

Mazel Tov
Mazel Tov

Reputation: 2182

for query with pointer U have to use query like that

let discoveryQuery = PFQuery(className: "DiscoveryDetails")
discoveryQuery.cachePolicy = .CacheElseNetwork 
discoveryQuery.whereKey("discoveryID", equalTo: PFObject(withoutDataWithClassName: "Discovery", objectId: "\(varInDDT!.objectId!)"))
discoveryQuery.orderByDescending("createdAt")
return discoveryQuery

for downloading the detail you have to pass at least ID of the object you want to download from the first viewController to the second or you can pass the whole PFObject

DiscoveryTableView

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("showDetail", sender: indexPath)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  if(segue.identifier == "showDetail"){ // define the segue Name
    let controller = (segue.destinationViewController as! DiscoveryDetailTableViewController)
    let row = sender!.row //we know that sender is an NSIndexPath here.
    let selectedObj = discoveryObjects[row] // some var where you hold your data
    controller.varInDDT = selectedObj
  }
}

and define the var of PFObject in detailVC

DiscoveryDetailTableViewController

var varInDDT : PFObject?

Upvotes: 1

Related Questions