0

Good Evening. I am having trouble with transferring PFFile from my TableViewController to my SecondViewController. I want to be able for users to pick an image out of the tableview then edit the video how they see fit on the next view controller.

I am able to select the cell and transfer to the MovieDetailedViewController,if I remove the

if segue.identifier == "viewMe" {
        if var indexPath = self.tableView.indexPathForSelectedRow() {
         var object:PFObject = (self.resultsVideoFiles[indexPath.row] as? PFObject)!
         var file:PFFile = object.objectForKey("video") as! PFFile
        (segue.destinationViewController as! MovieDetailedViewController)
    }

    }

but the wrong video plays. How would I get the right video to play? And If I keep the same line of code under the prepareForSegue function then I get a break in my program saying Could not cast value of type 'PFFile' (0x10c4fff90) to 'PFObject'??

Here is the code to my first view controller.

import UIKit
import Parse
import ParseUI

class MovieListViewController: UITableViewController {
    var resultsMovienameArray = [String]()
    var resultsImageFiles = [PFFile]()
    var resultsVideoFiles = [PFFile]()
    var video:PFFile!



    override func viewDidLoad() {
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewDidAppear(animated: Bool) {
        resultsMovienameArray.removeAll(keepCapacity: false)
        resultsImageFiles.removeAll(keepCapacity: false)
        var query = PFQuery(className: "Videos")
        var objects = query.findObjects()
        for object in objects! {

            self.resultsMovienameArray.append(object["name"] as! String)
            self.resultsImageFiles.append(object["picture"] as! PFFile)





            self.tableView.reloadData()


        }


    }


    // MARK: - Table view data source

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return resultsMovienameArray.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("movieCell", forIndexPath: indexPath) as! MovieViewCell

        // Configure the cell...

        cell.movieNameLblTxt.text = self.resultsMovienameArray[indexPath.row]
        resultsImageFiles[indexPath.row].getDataInBackgroundWithBlock {
            (imageData: NSData?, error:NSError?) -> Void in

            if error == nil {

                let image = UIImage(data: imageData!)
                cell.movieImg.image = image

            }
        }


        return cell

    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        var cell = tableView.cellForRowAtIndexPath(indexPath) as! MovieViewCell
        self.performSegueWithIdentifier("viewMe", sender: self)
    }

     override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var detailScene = segue.destinationViewController as! MovieDetailedViewController
    if segue.identifier == "viewMe" {
        if var indexPath = self.tableView.indexPathForSelectedRow() {
         var object:PFObject = (self.resultsVideoFiles[indexPath.row] as? PFObject)!
         var file:PFFile = object.objectForKey("video") as! PFFile
        (segue.destinationViewController as! MovieDetailedViewController)
    }

    }




}



}

Then here is my code to my SecondViewController

import UIKit
import MediaPlayer
import Parse
import ParseUI

class MovieDetailedViewController: UIViewController {
    var moviePlayer:MPMoviePlayerController!
    var detailItem: AnyObject?
    var videoObject: PFObject!

    override func viewDidLoad() {


        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.
    }

    override func viewDidAppear(animated: Bool) {
        var query = PFQuery(className: "Videos")
        query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in

            if error == nil {
                for object in objects! {
                    var theVideo:PFFile = object.objectForKey("video") as! PFFile
                    var url:NSURL = NSURL(string: theVideo.url!)!
                    theVideo.getDataInBackgroundWithBlock({ (data:NSData?, error: NSError?) -> Void in
                        if error == nil {
                            self.moviePlayer = MPMoviePlayerController(contentURL: url)
                            self.moviePlayer.view.frame = CGRect(x: 20, y: 100, width: 200, height: 150)

                            self.view.addSubview(self.moviePlayer.view)
                            self.moviePlayer.fullscreen = true

                            self.moviePlayer.controlStyle = MPMovieControlStyle.Embedded
                            self.moviePlayer.prepareToPlay()
                            self.moviePlayer.play()



                        }

                    })

                }
            }

        }
    }



    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

I would greatly appreciate the help.

just_denzzy
  • 52
  • 10

1 Answers1

0

i'm thinking that its quite late to answer but you should do that create a PFObject in viewController and pass it with using indexpath.row like this in didSelectRowAtIndex method

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

    let destinationVC: ViewController = self.storyboard!.instantiateViewControllerWithIdentifier("eVC") as! ViewController

    if let indexPath = self.tableView.indexPathForSelectedRow {
        let row = Int(indexPath.row)
        destinationVC.currentObject = objects?[row] as? PFObject

    }

  navigationController?.pushViewController(destinationVC, animated: true)  

}

And I think this will solve your issue .

Sabhay Sardana
  • 876
  • 1
  • 10
  • 27