gpt4 book ai didi

iOS Swift 在 View 关闭时停止 MoviePlayer

转载 作者:行者123 更新时间:2023-11-28 13:12:47 29 4
gpt4 key购买 nike

我想从 url 获取视频并在点击按钮时在 View 中播放它。

我有一个从 URL 播放视频的 moviePlayer。一切看起来都不错,但是当我点击“返回”或“下一步”按钮(即更改 viewController)时,视频继续播放(因为我仍然能够在新屏幕上听到音频。

所以我想到在 viewDidDismiss 上添加 moviePlayer.Stop()。它在第一次 View 更改时效果很好,但是当我返回到 moviePlayer View 并单击下一步时,我在 moviePlayer.Stop() 处发现了一个 nil 错误(因为电影已经停止)。有人可以帮助我了解如何执行此操作吗?

导入 UIKit导入媒体播放器

类 InformationViewController: UIViewController {

@IBOutlet var thumbnailImage: UIImageView!
@IBOutlet var videoPlayerView: UIView!

@IBOutlet var controlBtn: UIButton!

var moviePlayer:MPMoviePlayerController!
var url:NSURL = NSURL(string: "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v")!


override func viewDidLoad() {
super.viewDidLoad()

}

func videoThumbnailIsAvailable(notification: NSNotification){

if let player = moviePlayer{
println("Thumbnail is available")
NSNotificationCenter.defaultCenter().addObserver(self,
selector: "videoThumbnailIsAvailable:",
name: MPMoviePlayerThumbnailImageRequestDidFinishNotification,
object: nil)
/* Capture the frame at the third second into the movie */
let thirdSecondThumbnail = 3.0

/* We can ask to capture as many frames as we
want. But for now, we are just asking to capture one frame
Ask the movie player to capture this frame for us */
moviePlayer.requestThumbnailImagesAtTimes([thirdSecondThumbnail],
timeOption: .NearestKeyFrame)

/* Now get the thumbnail out of the user info dictionary */
let thumbnail =
notification.userInfo![MPMoviePlayerThumbnailImageKey] as? UIImage

if let imageR = thumbnail{

/* We got the thumbnail image. You can now use it here */
println("Thumbnail image = \(imageR)")
//println(UIImage(data: imageR))
thumbnailImage.image = imageR
}
}
}

@IBAction func controlBtn(sender: AnyObject) {
controlBtn.alpha = 0
moviePlayer = MPMoviePlayerController(contentURL: url)
let frameWidth = self.videoPlayerView.frame.size.width
let frameHeight = self.videoPlayerView.frame.size.height

//moviePlayer.view.frame = CGRect(x: 24, y: 18, width: frameWidth, height: frameHeight)

self.videoPlayerView.addSubview(moviePlayer.view)


// Send button backword
self.videoPlayerView.sendSubviewToBack(moviePlayer.view)
moviePlayer.fullscreen = false
moviePlayer.controlStyle = MPMovieControlStyle.Embedded

// Pure Visual Format Language style (http://stackoverflow.com/questions/26180822/swift-adding-constraints-programmatically)
(moviePlayer.view).setTranslatesAutoresizingMaskIntoConstraints(false)
let views = ["view": videoPlayerView, "videoView": moviePlayer.view]

var constH = NSLayoutConstraint.constraintsWithVisualFormat("H:[view]-(<=0)-[videoView(\(frameWidth))]", options: .AlignAllCenterY, metrics: nil, views: views)
view.addConstraints(constH)
var constW = NSLayoutConstraint.constraintsWithVisualFormat("V:[view]-(<=0)-[videoView(\(frameHeight))]", options: .AlignAllCenterX, metrics: nil, views: views)
view.addConstraints(constW)

}

override func viewDidDisappear(animated: Bool) {
moviePlayer.stop()

}
}

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

从您的代码看来,您的 moviePlayer 属性在调用 controlBtn(sender) 操作之前未定义,因此如果您离开此 View Controller 而没有先按下那个按钮,当 View Controller 消失时,moviePlayer 将为 nil

override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated) ///< Don't for get this BTW!

if let player = self.moviePlayer {
player.stop()
}
}

此外,您的 moviePlayer 属性应该是可选的,而不是隐式解包的可选属性。这就是可选项的意义所在——它们可以防止您犯这些错误并避免像您正在经历的那样发生崩溃。

var moviePlayer: MPMoviePlayerController?

关于iOS Swift 在 View 关闭时停止 MoviePlayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30687380/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com