繁体   English   中英

在 Swift 的 NSDocument 应用程序中从 arguments 行打开文件的正确方法是什么?

[英]What is the correct way to open a file from line arguments in an NSDocument application in Swift?

我正在开发一个基于 MacOS Document 的应用程序,它可以打开某种文件类型。 我想做的是为这个应用程序编写一些 UI 测试,但我想为这些 UI 测试加载一些模拟数据。 据我了解,我实际上应该使用 launchArguments 或 launchEnvironment 变量来加载这个模拟数据。

因此,在我看来,正确的做法是创建一些测试数据文件,并在应用程序启动时使用以下内容打开这些文件:

let app = XCUIApplication()  
app.launchArguments.append("-url")  
app.launchArguments.append($PATH)  
app.launch()

现在我的问题是,我应该在哪里添加在启动期间打开文件的代码? NSDocumentDelegate 是否有我应该重写的方法? 我应该调用openDocument(withContentsOf:display:completionHandler:)还是完全设置fileURL或其他东西?

现在我的应用程序打开最后打开的文件或打开一个新文档。 我可以尝试覆盖makeUntitledDocument(ofType typeName: String)func restoreWindow(withIdentifier identifier: NSUserInterfaceItemIdentifier, state: NSCoder, completionHandler: @escaping (NSWindow?, Error?) -> Void)但我不喜欢其中任何一个是正确的选择。

所以我想我有两个问题:1)为基于 NSDocument 的应用程序的 UI 测试传递模拟数据的正确方法是什么。 2) 使用 line 参数在启动应用程序时打开文件的正确方法是什么。

1) 为基于 NSDocument 的应用程序的 UI 测试传递模拟数据的正确方法是什么?

我要做的是:

1) 要打开一个新文档,我调用makeUntitledDocument(ofType typeName: String) 根本不需要覆盖它。 然后,您可以根据需要使用此 API 的返回值设置文档。

2)要打开以前保存的文档,我确实调用了openDocument(withContentsOf:display:completionHandler:)

使用伪代码将是这样的,您可以将任何 URL 与模拟数据一起传递:

func openDocument(itemData:ItemData) {
  let controller = NSDocumentController.shared
   controller.openDocument(withContentsOf: itemData.url, display: true)
   { (_, _, error:Error?) in
        if error != nil {
             handleError(.unableToOpenDocument(itemData.url))
        }
    }
}

再一次,没有必要覆盖openDocument(withContentsOf:display:completionHandler:)

2)使用 line 参数在启动应用程序时打开文件的正确方法是什么?

我会为此使用 bash 脚本:

open -a $APP_PATH $DOCUMENT_PATH

这将模仿 Finder 的功能,但如果您不喜欢该选项,那么您可以随时尝试他们在此问题答案中提出的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM