You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift技术求助:视频播放结束后跳转新界面实现问题

解决视频播放结束后跳转至指定界面的问题

没问题,我来帮你搞定这个跳转需求!你现在的代码已经实现了播放和关闭视频,但关闭后只是回到初始界面,咱们只需要在视频结束的回调里,等播放器关闭完成后再执行跳转操作就行。

关键修改点

  1. 在视频播放完成的回调方法里,等待播放器 dismiss 完成后再跳转到目标界面(因为 dismiss 是异步操作,直接跳转可能会出问题)
  2. 记得移除通知观察者,避免内存泄漏
  3. 提前准备好你要跳转的目标 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:32:58