我有一个新问题在等待解决方案。我现在有点布线了。我的MainView是一个TableView,在6个自定义单元格中的一个中,有一个单元格中有一个TableView。通过单击此内部tableView的单元格,我想要一个新的YTPlayerViewController,一个使用谷歌YThelper类观看YouTube视频的视图。
问题是,performSegueWithIdentifier
和override 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)
}
}
答案 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)
}
}