prepareForSegue 自定义 UITableViewCell

prepareForSegue out of custom UITableViewCell

我有一个新问题等待解决。我现在有一点有线布局。我的 MainView 是一个 TableView,在 6 个自定义单元格之一中是一个包含 TableView 的单元格。通过单击这个内部 tableView 的单元格,我想要一个新的 YTPlayerViewController,一个使用 googles YThelper classes.

观看 youtube 视频的视图

问题是,performSegueWithIdentifieroverride func prepareForSegue 东西不起作用,因为我必须在不知道这些函数的自定义 UITableViewCell class 中处理它们。

还有其他选择吗?

我只想将我的 videoId 从单元格传输到 YTPlayerViewController,打开它并播放视频。从那里应该可以回去。

希望大家能够理解并帮助我。

来自德国的问候

我的Class:

class DetailVideoCell: UITableViewCell , UITableViewDelegate, UITableViewDataSource {


    @IBOutlet weak var tableView: UITableView!

    var selectedVideoIndex: Int!



    /*override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showPlayer" {
            let playerViewController = segue.destinationViewController as! YTPlayerViewController
            playerViewController.videoID = Data.youTubeVideos[selectedVideoIndex]["videoId"] as! String
        }
    }*/



    // MARK: TableViewDataSource functions.

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return Data.youTubeVideos.count ?? 3
    }

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

        let url = NSURL(string: Data.youTubeVideos[indexPath.row]["thumbnail"] as! String)
        let data = NSData(contentsOfURL: url!)
        let image = UIImage(data: data!)

        cell.videoThumbnail.image = image
        cell.channelTitle.text = Data.youTubeVideos[indexPath.row]["channelTitle"] as? String
        cell.videoTitle.text = Data.youTubeVideos[indexPath.row]["title"] as? String

        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        selectedVideoIndex = indexPath.row
        print(selectedVideoIndex)
        //performSegueWithIdentifier("showPlayer", sender: indexPath)
    }

}

在您的 DetailVideoCell 中:

// Create a protocol that will act as the delegate

protocol DetailVideoCellDelegate: class {
    func selectedCellAtIndex(index: Int)
}

class DetailVideoCell: UITableViewCell , UITableViewDelegate, UITableViewDataSource {


@IBOutlet weak var tableView: UITableView!

var selectedVideoIndex: Int!

// Create a delegate object
weak var delegate: DetailVideoCellDelegate?


/*override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
 if segue.identifier == "showPlayer" {
 let playerViewController = segue.destinationViewController as! YTPlayerViewController
 playerViewController.videoID = Data.youTubeVideos[selectedVideoIndex]["videoId"] as! String
 }
 }*/



// MARK: TableViewDataSource functions.

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return Data.youTubeVideos.count ?? 3
}

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

    let url = NSURL(string: Data.youTubeVideos[indexPath.row]["thumbnail"] as! String)
    let data = NSData(contentsOfURL: url!)
    let image = UIImage(data: data!)

    cell.videoThumbnail.image = image
    cell.channelTitle.text = Data.youTubeVideos[indexPath.row]["channelTitle"] as? String
    cell.videoTitle.text = Data.youTubeVideos[indexPath.row]["title"] as? String

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedVideoIndex = indexPath.row
    print(selectedVideoIndex)

    // use the delegate to send the selected index back to your MainView
    delegate?.selectedCellAtIndex(selectedVideoIndex)
    //performSegueWithIdentifier("showPlayer", sender: indexPath)
    }

}

在您的主视图中:

class MainView: DetailVideoCellDelegate {

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // However you are configuring your cells set the DetailVideoCell delegate to self

    if cell.delegate == nil {
        cell.delegate = self
    }

    return cell
}

func selectedCellAtIndex(index: Int) {

    // Or whatever you are using the index for
    let identifier = yourArray[index]

    // Easiest way is to use a navigation controller to handle the segues to be able to go back
    // Otherwise you will need to do it in a custom way
    self.navigationController?.performSegueWithIdentifier(identifier, sender: self)

    }
}