Swift技术求助:视频播放结束后跳转新界面实现问题
解决视频播放结束后跳转至指定界面的问题
没问题,我来帮你搞定这个跳转需求!你现在的代码已经实现了播放和关闭视频,但关闭后只是回到初始界面,咱们只需要在视频结束的回调里,等播放器关闭完成后再执行跳转操作就行。
关键修改点
- 在视频播放完成的回调方法里,等待播放器 dismiss 完成后再跳转到目标界面(因为 dismiss 是异步操作,直接跳转可能会出问题)
- 记得移除通知观察者,避免内存泄漏
- 提前准备好你要跳转的目标 ViewController(假设叫
TargetViewController)
修改后的完整代码
import UIKit import AVKit import AVFoundation class ViewController: UIViewController { let playerViewController = AVPlayerViewController() override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func playButton(_ sender: AnyObject) { guard let movieURL = Bundle.main.url(forResource: "video", withExtension: "mp4") else { print("找不到视频文件") return } let player = AVPlayer(url: movieURL) playerViewController.player = player // iOS 10+ 推荐用 block 形式的通知,自动管理移除 NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main) { [weak self] _ in self?.handleVideoEnd() } present(playerViewController, animated: true) { player.play() } } private func handleVideoEnd() { // 先关闭播放器,完成后跳转目标界面 playerViewController.dismiss(animated: true) { [weak self] in guard let self = self else { return } // 方式1:从 Storyboard 跳转(假设目标VC的storyboard ID是"TargetVC") guard let targetVC = self.storyboard?.instantiateViewController(withIdentifier: "TargetVC") as? TargetViewController else { print("无法实例化目标ViewController") return } self.navigationController?.pushViewController(targetVC, animated: true) // 如果你不用导航栏,也可以用 present: // self.present(targetVC, animated: true) } } // 如果用的是旧的 selector 方式通知,要在deinit里移除观察者 deinit { NotificationCenter.default.removeObserver(self) } }
额外说明
- 如果你是用代码创建的目标VC,替换掉上面的实例化代码就行:
let targetVC = TargetViewController() self.navigationController?.pushViewController(targetVC, animated: true) - 记得给目标ViewController设置好
storyboard ID(如果用Storyboard的话),不然会实例化失败 - 用
[weak self]避免循环引用,防止内存泄漏
这样修改后,视频播放结束关闭播放器后,就会自动跳转到你想要的界面啦!
内容的提问来源于stack exchange,提问作者user2655836
相关产品推荐
相关产品推荐

