swift - 如何将 PFFile 从一个 ViewController 传输到另一个 ViewController

标签 swift parsing ios8 xcode6 pffile

晚上好。我在将 PFFile 从 TableViewController 传输到 SecondViewController 时遇到问题。我希望用户能够从桌面 View 中选择图像,然后按照他们认为适合下一个 View Controller 的方式编辑视频。

如果我删除

,我可以选择单元格并传输到 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”??

这是我的第一个 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)
    }

    }




}



}

然后这是我的 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.
    }
    */

}

我将非常感谢您的帮助。

最佳答案

我认为现在回答已经很晚了,但您应该在 viewController 中创建一个 PFObject 并使用 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)  

}

我认为这会解决您的问题。

关于swift - 如何将 PFFile 从一个 ViewController 传输到另一个 ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237526/

相关文章:

ios8 - 从 fetchAssetsWithALAssetURLs 返回的 PHAsset : is always nil when choosing a photo from the "My Photo Stream" album using UIImagePickerController

iphone - 如何使用swift在游戏中心报告高分

swift - 当文本字段中有整数时按钮不启用/禁用

用于在应用程序中显示类对象的 C++ 代码分析器

Swift,无法使用 JSQMessagesViewController 重新加载聊天窗口

mysql - 如何修复MySQL错误#1064?

Scala:我可以将组合器解析器微调为本地贪婪吗?

objective-c - iOS8 Xcode6 UICollectionView sizeForIndexPath : does not get called on rotation

ios - 当单元格超出屏幕时,多次调用 UITableView

swift - 返回核心数据中存储的从现在起 1 个月后发生的所有生日