Как перевести файл PFFile с одного ViewController на другой

Добрый вечер. У меня проблемы с передачей PFFile из моего TableViewController в мой SecondViewController. Я хочу, чтобы пользователи могли выбрать изображение из табличного представления и затем отредактировать видео, как они считают нужным, на следующем контроллере представления.

Я могу выбрать ячейку и перенести ее в 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)
    }

    }

но проигрывается не то видео. Как бы получить правильное видео для воспроизведения? И если я сохраню ту же строку кода в функции prepareForSegue, то в моей программе произойдет перерыв, сказав, что не удалось привести значение типа 'PFFile' (0x10c4fff90) к 'PFObject'??

Вот код моего первого контроллера просмотра.

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

    }




}



}

Тогда вот мой код для моего 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.
    }
    */

}

Я был бы очень признателен за помощь.

1 ответ

Я думаю, что уже довольно поздно, чтобы ответить, но вы должны сделать это, чтобы создать PFObject в viewController и передать его с помощью indexpath.row как это в методе didSelectRowAtIndex

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)  

}

И я думаю, что это решит вашу проблему.

Другие вопросы по тегам