0

问题: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复选框关闭,则使用文件选择器对话框。

测试:

  1. 启动后,再按loadButton一下useHardCodedFlaghardCodedPath是用来做网址的 - 见loadMovies()。它确认默认 URL 路径是好的,但 AVPlayerView 只显示一个占位符 - 带有斜线的电影播放图标 - 而不是电影。

  2. 如果我然后禁用useHardCodedFlag然后使用文件选择器对话框选择相同的文件,电影会完美打开并且应用程序报告选择的 URL 的路径与原始硬编码的路径相同。

  3. 那时,我useHardCodedFlag从文本字段启用并加载 AVPlayerView。它现在可以正常工作即使在新窗口中,即使原始窗口已经关闭。粘贴不同的有效路径hardCodedPath仍然失败(相同的窗口或新的),直到它也被选择器第一次打开。

  4. 从两个具有不同电影的窗口开始,我可以通过交换内容来交换它们的电影,然后在启用hardCodedPath的情况下点击每个窗口- 建议没有缓存(至少在窗口级别)。loadButtonuseHardCodedFlag

摘要:我可以使用从路径字符串构建的 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
    }
}



4

0 回答 0