Swift 如何让 webView 加载得更快
Swift how to get webView to load faster
我有一个 class VideoTableController,它包含一个 tableview,里面有一堆 youtube 视频。
选择视频后,它会启动另一个视图控制器,其中包含一个将播放指定的 YouTube 视频的网络视图。
我试过将加载视频的代码放在 videoTableController 的 prepareForSegue 函数中,但问题是 VideoPlayer 控制器尚未实例化,所以我无法修改 video_view: UIWebView在prepareForSegue函数中。
我想知道我是否执行此 videoPlayer() 以在 prepareForSegue 函数中实例化它,然后修改值 VideoPlayer.video_view.loadHTMLString() 是否会起作用,或者当 videoPlayer 被转换到它的另一个实例时实例化了吗?
这是我目前在我的视频播放器中的内容 class:
var video_player_url = ""
class VideoPlayer: UIViewController {
@IBOutlet weak var video_view: UIWebView!
override func viewDidLoad() {
self.video_view.loadHTMLString("<iframe width=\"\(video_view.frame.width)\" height=\"\(video_view.frame.height)\" src=\"https://www.youtube.com/embed/\(video_player_url)\" frameborder=\"0\" allowfullscreen></iframe>", baseURL: nil)
super.viewDidLoad()
// Do any additional setup after loading the view.
}
这是我的 videoTableController class 调用它:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.performSegueWithIdentifier("video_player_segue", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let indexPath = self.tableView.indexPathForSelectedRow
video_player_url = video_urls[indexPath!.row]
}
在 prepareForSegue 中,class 已经被实例化,但它可能还没有从 StoryBoard 加载。这就是它能够在 prepareForSegue 中为您提供目标控制器的方式。常用的技术是在 class 中设置一些其他变量,然后在目标控制器的 viewWillAppear 中,使用该值来执行您想执行的任何操作。
class VideoPlayer : ViewController {
var video_player_url: String?
@IBOutlet weak var video_view: UIWebView!
override func viewWillAppear(animated: Bool) {
if let url = self.video_player_url {
self.video_view.loadHTMLString("<iframe width=\"\(video_view.frame.width)\" height=\"\(video_view.frame.height)\" src=\"https://www.youtube.com/embed/\(video_player_url)\" frameborder=\"0\" allowfullscreen></iframe>", baseURL: nil)
}
}
}
并且在您的 table 视图控制器中...
class VideoTableController : UITableViewController {
// stuff goes here
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let indexPath = self.tableView.indexPathForSelectedRow
// verify that indexPath is not nil or your app will crash.
let destinationController = segue.destinationViewController as! VideoPlayer
destinationController.video_player_url = video_urls[indexPath!.row]
}
我有一个 class VideoTableController,它包含一个 tableview,里面有一堆 youtube 视频。
选择视频后,它会启动另一个视图控制器,其中包含一个将播放指定的 YouTube 视频的网络视图。
我试过将加载视频的代码放在 videoTableController 的 prepareForSegue 函数中,但问题是 VideoPlayer 控制器尚未实例化,所以我无法修改 video_view: UIWebView在prepareForSegue函数中。
我想知道我是否执行此 videoPlayer() 以在 prepareForSegue 函数中实例化它,然后修改值 VideoPlayer.video_view.loadHTMLString() 是否会起作用,或者当 videoPlayer 被转换到它的另一个实例时实例化了吗?
这是我目前在我的视频播放器中的内容 class:
var video_player_url = ""
class VideoPlayer: UIViewController {
@IBOutlet weak var video_view: UIWebView!
override func viewDidLoad() {
self.video_view.loadHTMLString("<iframe width=\"\(video_view.frame.width)\" height=\"\(video_view.frame.height)\" src=\"https://www.youtube.com/embed/\(video_player_url)\" frameborder=\"0\" allowfullscreen></iframe>", baseURL: nil)
super.viewDidLoad()
// Do any additional setup after loading the view.
}
这是我的 videoTableController class 调用它:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.performSegueWithIdentifier("video_player_segue", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let indexPath = self.tableView.indexPathForSelectedRow
video_player_url = video_urls[indexPath!.row]
}
在 prepareForSegue 中,class 已经被实例化,但它可能还没有从 StoryBoard 加载。这就是它能够在 prepareForSegue 中为您提供目标控制器的方式。常用的技术是在 class 中设置一些其他变量,然后在目标控制器的 viewWillAppear 中,使用该值来执行您想执行的任何操作。
class VideoPlayer : ViewController {
var video_player_url: String?
@IBOutlet weak var video_view: UIWebView!
override func viewWillAppear(animated: Bool) {
if let url = self.video_player_url {
self.video_view.loadHTMLString("<iframe width=\"\(video_view.frame.width)\" height=\"\(video_view.frame.height)\" src=\"https://www.youtube.com/embed/\(video_player_url)\" frameborder=\"0\" allowfullscreen></iframe>", baseURL: nil)
}
}
}
并且在您的 table 视图控制器中...
class VideoTableController : UITableViewController {
// stuff goes here
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let indexPath = self.tableView.indexPathForSelectedRow
// verify that indexPath is not nil or your app will crash.
let destinationController = segue.destinationViewController as! VideoPlayer
destinationController.video_player_url = video_urls[indexPath!.row]
}