swift - 在 Swift 的 NSDocument 应用程序中从行参数打开文件的正确方法是什么?
问题描述
我正在开发一个基于 MacOS Document 的应用程序,它可以打开某种文件类型。我想做的是为这个应用程序编写一些 UI 测试,但我想为这些 UI 测试加载一些模拟数据。据我了解,我实际上应该使用 launchArguments 或 launchEnvironment 变量来加载这个模拟数据。
因此,在我看来,正确的做法是创建一些测试数据文件,并在应用程序启动时使用以下内容打开这些文件:
let app = XCUIApplication()
app.launchArguments.append("-url")
app.launchArguments.append($PATH)
app.launch()
现在我的问题是,我应该在哪里添加在启动期间打开文件的代码?NSDocumentDelegate 是否有我应该重写的方法?我应该打电话openDocument(withContentsOf:display:completionHandler:)
还是只设置 thefileURL
或其他东西?
现在我的应用程序打开最后打开的文件或打开一个新文档。我可以尝试覆盖 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 的功能,但如果您不喜欢该选项,那么您可以随时尝试他们在此问题的答案中提出的建议。
推荐阅读
- python - 通过在自定义模板标签中传递不同的参数来重用 Django 中的模板
- kubernetes - 在 Volume mountPath 中使用 Pod 名称或 uid
- node.js - 我得到 NPX: command not found 每当我运行 create-react-app
- google-workspace - 域验证后锁定 GSuite 管理员
- node.js - 无法使用 socket.io 连接到房间
- c# - 仅针对一台特定计算机上的 .NET 应用程序的 SSL 错误“收到的消息意外或格式错误”
- animation - SwiftUI 动画滑入和滑出
- javascript - HTML2Canvas 库有时仅在通过链接上传图像时随机生成空白图像
- c# - 从 C# 驱动程序建立多个快速连接时,服务器发送了一个无效的随机数
- node.js - 创建新的角度项目错误