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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:36:19