在 Swift 的 NSDocument 应用程序中从行参数打开文件的正确方法是什么?
What is the correct way to open a file from line arguments in an NSDocument application in Swift?
我正在开发一个基于 MacOS 文档的应用程序,该应用程序可以打开某种文件类型。我想做的是为此应用程序编写一些 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) 为 UI 测试基于 NSDocument 的应用程序传递模拟数据的正确方法是什么。 2) 在启动应用程序时使用行参数打开文件的正确方法是什么。
1) 为 UI 测试基于 NSDocument 的应用程序传递模拟数据的正确方法是什么?
我的做法是:
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) 在启动应用程序时使用行参数打开文件的正确方法是什么?
我会为此使用 bash 脚本:
open -a $APP_PATH $DOCUMENT_PATH
这将模仿 Finder 的功能,但如果您不喜欢该选项,那么您可以随时尝试他们在这个问题的答案中提出的建议 here。
我正在开发一个基于 MacOS 文档的应用程序,该应用程序可以打开某种文件类型。我想做的是为此应用程序编写一些 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) 为 UI 测试基于 NSDocument 的应用程序传递模拟数据的正确方法是什么。 2) 在启动应用程序时使用行参数打开文件的正确方法是什么。
1) 为 UI 测试基于 NSDocument 的应用程序传递模拟数据的正确方法是什么?
我的做法是:
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) 在启动应用程序时使用行参数打开文件的正确方法是什么?
我会为此使用 bash 脚本:
open -a $APP_PATH $DOCUMENT_PATH
这将模仿 Finder 的功能,但如果您不喜欢该选项,那么您可以随时尝试他们在这个问题的答案中提出的建议 here。