WebView 在 Xcode 7.x [W/Code+Images] 中不返回 YouTube 视频
Posted
技术标签:
【中文标题】WebView 在 Xcode 7.x [W/Code+Images] 中不返回 YouTube 视频【英文标题】:WebView doesn't return YouTube video in Xcode 7.x [W/Code+Images] 【发布时间】:2015-11-11 12:10:59 【问题描述】:我正在 Swift 2 中构建一个视频播放器应用程序,它将加载 3 个视频,这些视频的数据(标题、描述、缩略图和视频 url)保存在名为 videos
的全局数组中。
此应用包含一个包含 3 个单元格的表格视图,当用户单击其中一个单元格时,视频播放器视图将打开。我将其配置为具有可以播放 youtube 视频的 Web 视图。我知道我可以使用 YouTube API 以更好的方式做到这一点,但现在我只专注于使用这 3 个视频。
我创建了一个名为 PlayerViewController.swift
的新 Cocoa Touch Class 文件,并在其中配置了视频播放器。
Main.storyboard
中的 Video Player View 的类设置为 PlayerViewController
。
标签工作正常,但 WebView 无法加载,我可以移动它,但根本没有视频。 我究竟做错了什么?我必须为 Web 视图设置任何类吗?如何使视频在此 WebView 中正确播放? 代码在下面。
提前致谢!
播放器视图控制器:
//import Foundation
import UIKit
//import WebKit
//import AVFoundation
class PlayerViewController: UIViewController
@IBOutlet weak var videoView: UIWebView!
@IBOutlet weak var playerTitle: UILabel!
@IBOutlet weak var playerDescription: UILabel!
override func viewDidLoad()
super.viewDidLoad()
videoView.allowsInlineMediaPlayback = true
videoView.loadhtmlString("<iframe width=\"\(videoView.frame.width)\" height=\"\(videoView.frame.height)\" src=\"\(videos[activeVideo]["video"])?&playsinline=1\" frameborder=\"0\" allowfullscreen></iframe>", baseURL: nil)
playerTitle.text = videos[activeVideo]["title"]
playerDescription.text = videos[activeVideo]["description"]
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
视图控制器:
import UIKit
var videos = [Dictionary<String,String>()]
var activeVideo = -1
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
@IBOutlet var tableView: UITableView!
override func viewDidLoad()
super.viewDidLoad()
if videos.count == 1
videos.removeAtIndex(0)
// Check if places != to 1 and not 0 because we created the dictionary places as a global var outside the ViewController and that can not be empty.
videos.append(["title":"Video 1","description":"Description 1","thumbnail":"http://img.youtube.com/vi/6oXTFb-52Zc/0.jpg","video":"https://www.youtube.com/embed/6oXTFb-52Zc"])
videos.append(["title":"Video 2","description":"Description 2","thumbnail":"http://img.youtube.com/vi/dkwuCeCQVg8/0.jpg","video":"https://www.youtube.com/embed/dkwuCeCQVg8"])
videos.append(["title":"Video 3","description":"Description 3","thumbnail":"http://img.youtube.com/vi/6Zf_70xM1Cw/0.jpg","video":"https://www.youtube.com/embed/v=6Zf_70xM1Cw"])
func numberOfSectionsInTableView(tableView: UITableView) -> Int
return 1
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return videos.count
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! CustomTableViewCell
let url = NSURL(string: videos[indexPath.row]["thumbnail"]!)
let data = NSData(contentsOfURL: url!)
cell.img?.image = UIImage(data: data!)
cell.ttl?.text = videos[indexPath.row]["title"]
cell.dsc?.text = videos[indexPath.row]["description"]
return cell
func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath?
activeVideo = indexPath.row
return indexPath
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if segue.identifier == "back"
activeVideo = -1
// Resetting the value of activeVideo
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
Empty WebView
Main.storyboard
【问题讨论】:
您是否遇到任何控制台错误? 没有错误...只是一个移动的空 WebView :( 我看到在您的播放器视图控制器中,在“videoView.loadHTMLString”上设置的字符串未正确转义。如果那在您的实际代码中,您将遇到问题。 This-> ideo]["video"])?&playsinline 我尝试过这样做,但出现了更多错误...我认为由于 ["video"] 已经在 () 中,因此不需要转义。 *斜线括号内 【参考方案1】:我也遇到过这样的问题。而不是这一行:
videoView.loadHTMLString("<iframe width=\"\(videoView.frame.width)\" height=\"\(videoView.frame.height)\" src=\"\(videos[activeVideo]["video"])?&playsinline=1\" frameborder=\"0\" allowfullscreen></iframe>", baseURL: nil)
尝试使用以下内容:
videoView.loadHTMLString("<html><style type=\"text/css\">bodymargin:0px;padding:0px;</style><script type='text/javascript' src='http://www.youtube.com/iframe_api'></script><script type='text/javascript'>function onYouTubeIframeAPIReady()ytplayer=new YT.Player('playerId',events:onReady:onPlayerReady)function onPlayerReady(a)a.target.playVideo();</script><body><iframe id='playerId' type='text/html' width='\(videoView.frame.width)' height='\(videoView.frame.height)' src='\(videos[activeVideo]["video"])?enablejsapi=0&rel=0&playsinline=1&autoplay=1' frameborder='0'></body></html>", baseURL: nil)
编辑:
再次检查您的代码,我意识到您没有在任何地方调用 playerViewController。将您拥有的所有代码放在 cellForIndexPath 中 PayerViewController 的 viewDidLoad() 中。您应该在单元格中添加一个 webView 才能工作。另一方面,如果你想保持这样的 UI 来检索图像,你应该像这样进行异步调用:
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(NSURL(string:imageURL())!, completionHandler: (data, response, error) -> Void in
if let dataImage = data
dispatch_async(dispatch_get_main_queue(),
let image: UIImage? = UIImage(data: dataImage)
if let _ = image
cell.image.image = image!
)
else
)
task.resume()
UI 位于主线程上,因此当您获得异步响应时,您必须将其附加到 main_thread。
【讨论】:
您好,谢谢您的回复! :) 但是现在我遇到了错误,你可以在这里看到它们:link。 playinline 是我在这个视频教程link 中看到的东西,所以我不明白你为什么使用它和 enablejsapi,因为它们是变量。你能看看吗? 哦,是的,这是我的错,我忘了删除我的代码中的一些变量。现在我改变了它。你可以复制粘贴它。 再次感谢您!但是,它似乎必须是别的东西,因为我仍然得到相同的空 WebView :( 你可以在这里看到它:link 感谢您的支持! :) 我试过这个并得到一个错误,因为videoView
出口仅在 PlayerViewController 中定义,我试图将它放在 ViewController 的 cellForRowAtIndexPath 中。然后我记得尝试在 videoView.loadHTMLString
中使用 + 将字符串添加到数组 videos
中,效果很好!像这样:videoView.loadHTMLString("<iframe width=\"\(videoView.frame.width)\" height=\"\(videoView.frame.height)\" src=\"" + videos[activeVideo]["video"]! + "\" frameborder=\"0\" allowfullscreen></iframe>", baseURL: nil)
我不明白为什么它适用于 + 而不是 slash(),但视频正在运行! :) 很高兴了解您的见解和替代方案,所以我接受了这个答案!我现在正在尝试使视频帧适合整个 Web 视图,因为尽管我设置了帧宽度和高度,但它们无法正常工作。图片:link 我是新来的,所以我不知道我是否必须为此创建一个新问题。希望没事!以上是关于WebView 在 Xcode 7.x [W/Code+Images] 中不返回 YouTube 视频的主要内容,如果未能解决你的问题,请参考以下文章
Swift 开发的代码在 Xcode 8.x 或 Xcode 7.x 中不起作用
Xcode 5 在带有 WebView 的新视图控制器中加载 URL
XCODE swift - webview 无法打开 ics 链接 - 在 safari 中有效