prepareForSegue超出自定义UITableViewCell

时间:2016-08-30 18:36:03

标签: ios swift uitableview uistoryboardsegue

我有一个新问题在等待解决方案。我现在有点布线了。我的MainView是一个TableView,在6个自定义单元格中的一个中,有一个单元格中有一个TableView。通过单击此内部tableView的单元格,我想要一个新的YTPlayerViewController,一个使用谷歌YThelper类观看YouTube视频的视图。

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

还有其他选择吗?

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

希望你们能理解并帮助我。

来自德国的问候

我的班级:

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

}

1 个答案:

答案 0 :(得分:0)

在您的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)
    }

}

在MainView中:

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)

    }
}