Xcode制作视频播放器报错:Use of unresolved identifier: 'present'
解决Xcode中“Use of unresolved identifier: 'present'”错误
嘿,我懂你作为编程新手跟着教程踩坑的郁闷——这个错误其实很好解决,咱们一步步捋清楚!
问题根源
你写的VideoP类继承自NSObject,但present(_:animated:completion:)是UIViewController专属的方法,NSObject压根没有这个方法,所以编译器找不到present这个标识符,直接报错了。
两种可行解决方案
你可以根据自己的项目结构选一种:
方案1:让VideoP继承自UIViewController
如果这个类本来就是负责界面逻辑的视图控制器,直接把父类改成UIViewController就行:
import UIKit import AVKit // 把NSObject替换成UIViewController class VideoP: UIViewController { @IBAction func vidButton(_ sender: Any) { if let path = Bundle.main.path(forResource: "video", ofType: "mp4") { let video = AVPlayer(url: URL(fileURLWithPath: path)) let videoPlayer = AVPlayerViewController() videoPlayer.player = video // 现在present方法能正常调用了,补全completion参数(可以传nil或者写后续逻辑) present(videoPlayer, animated: true, completion: { // 可选:播放器弹出后自动播放视频 video.play() }) } } }
方案2:获取当前活跃的ViewController来present
如果VideoP不能改成UIViewController(比如它是个工具类),那得先找到当前屏幕上的顶层ViewController,再用它来调用present:
import UIKit import AVKit class VideoP: NSObject { @IBAction func vidButton(_ sender: Any) { if let path = Bundle.main.path(forResource: "video", ofType: "mp4") { let video = AVPlayer(url: URL(fileURLWithPath: path)) let videoPlayer = AVPlayerViewController() videoPlayer.player = video // 获取当前顶层的ViewController guard let topVC = UIApplication.shared.keyWindow?.rootViewController?.topMost() else { return } // 用顶层VC弹出播放器 topVC.present(videoPlayer, animated: true, completion: { video.play() }) } } } // 给UIViewController加个扩展,方便查找顶层VC extension UIViewController { func topMost() -> UIViewController { if let presentedVC = self.presentedViewController { return presentedVC.topMost() } return self } }
小提醒
别忘记补全completion参数哦,你原来的代码只写了completion:...,可以传nil或者像上面那样加个闭包实现自动播放之类的逻辑~
内容的提问来源于stack exchange,提问作者Laurcode
相关产品推荐
相关产品推荐

