问题:windowDidLoad()
如果插入底部的代码中,为什么这段代码不起作用,
loadMovieWithURL(whichView: AVPlayerView1,
url: URL(fileURLWithPath: "/Users/joeblogs/Desktop/my.mp4"))
但是我可以使用对话框选择器打开具有相同路径的相同文件(之后,如果调用的话,单行器确实可以工作)? 我是否缺少有关 URL 或 AVPlayerView 的内容? NSWindowController 中有一些不可见的缓存?也许是我看不到的编码错误?
设计:默认情况下,按下loadButton
会尝试从hardCodedPath
文本字段加载 AVPlayerView。默认的(但可编辑的)路径字符串 - 例如,/Users/joeblogs/Desktop/my.mp4 - 在 IB 中是硬编码的。如果useHardCodedFlag
复选框关闭,则使用文件选择器对话框。
测试:
启动后,再按
loadButton
一下useHardCodedFlag
,hardCodedPath
是用来做网址的 - 见loadMovies()
。它确认默认 URL 路径是好的,但 AVPlayerView 只显示一个占位符 - 带有斜线的电影播放图标 - 而不是电影。如果我然后禁用
useHardCodedFlag
然后使用文件选择器对话框选择相同的文件,电影会完美打开,并且应用程序报告选择的 URL 的路径与原始硬编码的路径相同。那时,我
useHardCodedFlag
从文本字段启用并加载 AVPlayerView。它现在可以正常工作,即使在新窗口中,即使原始窗口已经关闭。粘贴不同的有效路径hardCodedPath
仍然失败(相同的窗口或新的),直到它也被选择器第一次打开。从两个具有不同电影的窗口开始,我可以通过交换内容来交换它们的电影,然后在启用
hardCodedPath
的情况下点击每个窗口- 建议没有缓存(至少在窗口级别)。loadButton
useHardCodedFlag
摘要:我可以使用从路径字符串构建的 URL 将电影加载到 AVPlayerView 中,但前提是我首先使用模式对话框选择器中的 URL 打开它(自应用程序启动以来)。为什么?
核心 ~ 十几行在func loadMovies()
顶部,但为了您的观看乐趣,我包括了整个 WindowController。它建立在样板 macOS 文档模板之上,没有添加其他功能(打开、保存等)。
import Cocoa
import AVKit
import AVFoundation
class WindowController: NSWindowController {
@IBOutlet weak var AVPlayerView1: AVPlayerView!
@IBOutlet weak var loadButton: NSButton!
@IBOutlet weak var useHardCodedFlag: NSButton! //checkbox
@IBOutlet weak var hardCodedPath: NSTextField!
//action of loadButton
@IBAction func loadMovies(_ sender: Any) {
var url: URL?
// set url from text field or picker
// depending on hardCodeFlag control value
if Bool(useHardCodedFlag.intValue) == true {
url = URL(fileURLWithPath: hardCodedPath.stringValue)
} else {
let originalPath = hardCodedPath.stringValue //debug
url = pickFile()
// refresh text field with new value
hardCodedPath.stringValue = url?.path ?? "no string found"
compareURLstrings(s1: originalPath, s2: hardCodedPath.stringValue)
}
// sanity check on the url
guard let url = url, //not nil
FileManager.default //exists
.fileExists(atPath: url.path) == true
else {
print ("File URL \(String(describing: url?.path)) is nil or missing")
return
}
print("The URL is good: \(url.path)")
loadMovieWithURL(whichView: AVPlayerView1, url: url)
}
func loadMovieWithURL(whichView: AVPlayerView, url: URL){
let player = AVPlayer(url: url)
whichView.player = player
player.volume = 0.1
}
func pickFile()->URL?{
let dialog = NSOpenPanel();
dialog.title = "Choose a Movie";
dialog.showsResizeIndicator = true;
dialog.showsHiddenFiles = false;
dialog.allowsMultipleSelection = false;
dialog.canChooseDirectories = false;
dialog.allowedFileTypes = ["mov", "mp4"];
if (dialog.runModal() == NSApplication.ModalResponse.OK) {
return dialog.url
}
// "Cancel"
return nil
}
override func windowDidLoad() {
super.windowDidLoad()
// just an experiment to see if seeding bad urls initially
// might allow subsequent reloads from text field to work ... it doesn't
//let url = URL(string:"/")
//loadMovieWithURL(whichView: AVPlayerView1, url: url!)
}
}
func compareURLstrings(s1: String, s2: String){ //debugging only
s1 == s2 ?
print("The URLs are identical") :
print("The URLs are different")
}
extension Bool{
init(_ fromInt32: Int32){
fromInt32 == 0 ? self = false : self == true
}
}