我有一个简单的、最小的 Swift 应用程序,它具有一个带有 AVPlayerView 的 ViewController。当我在 XCode 中运行该应用程序时,AVPlayerView 显示为我的 ViewController 主视图的子视图,并且 ViewController 的 viewDidLoad: 方法被调用。
如果我独立于构建文件夹(或任何地方)打开应用程序,则不会调用 viewDidLoad 方法(从我添加的 OSLog'ing 可以看出)并且 AVPLayerView 不会出现。奇怪。
我已经构建了两次应用程序以消除任何界面构建器的怪异之处。该应用程序在所有系统中表现出相同的行为。
class ViewController: NSViewController {
@IBOutlet weak var playerView: AVPlayerView!
var playerLayer: AVPlayerLayer?
@IBAction func open(_:Any?) {
let panel = NSOpenPanel()
panel.canChooseFiles = true
panel.canChooseDirectories = false
panel.allowsMultipleSelection = false
if #available(macOS 11.0, *) {
panel.allowedContentTypes = [UTType.movie]
} else {
panel.allowedFileTypes = ["mov"]
}
panel.beginSheetModal(for: self.view.window!) { response in
if response == .OK {
if panel.urls.count > 0 {
DispatchQueue.main.async() {
let url = URL(fileURLWithPath:panel.urls[0].path)
let asset = AVURLAsset(url: url)
let item = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: item)
self.playerView.player = player
}
}
}
}
}
override func viewDidLoad() {
super.viewDidLoad(). //<- not called when run outside of Xcode
}
}
您遇到的问题可能与视图控制器及其管理的视图的生命周期有关。特别是,当应用程序独立于 Xcode 运行时,可能是视图控制器的视图未正确加载。这里有一些你可以尝试的事情:
1) 检查您的应用的入口点 确保您的应用的入口点设置正确。当您从 Xcode 运行您的应用程序时,入口点通常设置为您应用程序的主视图控制器。但是,当您独立于 Xcode 运行应用程序时,入口点的设置可能会有所不同。要检查应用程序的入口点,请查看应用程序目标设置中的“主界面”字段。确保它设置为正确的故事板或 xib 文件。
2) 检查视图控制器的视图属性 在您的视图控制器的 viewDidLoad 方法中,尝试记录视图属性的值以查看它是否为零。如果 view 属性为 nil,则表示该视图尚未加载。您可以通过访问视图属性强制加载视图。例如,您可以将以下代码添加到您的 viewDidLoad 方法中:
let _ = 查看
这将强制加载视图,这将导致调用 viewDidLoad 方法。
3) 检查 AVPlayerView 的约束 AVPlayerView 可能没有正确添加到视图层次结构中,这可能导致它不显示。检查 AVPlayerView 上的约束以确保它们设置正确。您也可以尝试以编程方式添加 AVPlayerView 而不是使用 Interface Builder 来查看是否可以解决问题。
4) 检查应用程序的日志 检查应用程序的日志,看看是否有任何与视图控制器或 AVPlayerView 相关的错误消息或警告。这可能会给您提供有关问题所在的线索。
5) 尝试在物理设备上运行应用程序 如果您在模拟器上运行该应用程序,请尝试在物理设备上运行它以查看问题是否仍然存在。模拟器的行为可能与物理设备不同。
希望这些建议能帮助您解决问题!