gpt4 book ai didi

swift - 在 SwiftUI 文档应用程序中,如何从函数中保存文档

转载 作者:行者123 更新时间:2023-12-04 17:16:51 27 4
gpt4 key购买 nike

当前版本的 Xcode(版本 12.5.1)为 macOS 的基于文档的应用程序提供了一个模板,提供以下文档模型:

struct MyDocument: FileDocument {
var text: String

init(text: String = "Hello, world!") {
self.text = text
}

static var readableContentTypes: [UTType] { [.exampleText] }

init(configuration: ReadConfiguration) throws {
guard let data = configuration.file.regularFileContents,
let string = String(data: data, encoding: .utf8)
else {
throw CocoaError(.fileReadCorruptFile)
}
text = string
}

func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
let data = text.data(using: .utf8)!
return .init(regularFileWithContents: data)
}
}
我想向这个结构添加一个方法,将我的文档传递给外部程序,并在这样做之前保存文档:
func passMyDocumentToProgram() {
// Save document
// Pass document to external program
}
问题是我不知道如何保存这样的文档。
生成的应用程序(从模板构建)提供了保存文档的功能(在菜单栏中),所以我应该以某种方式调用这个现有的功能。
据我了解, fileWrapper MyDocument 中的方法返回 FileWrapper有一个 write()可用于保存文档的方法;然而, fileWrapper方法需要一个 WriteConfiguration ,我不知道如何创建它。 WriteConfiguration 的文档非常稀疏,我在网上找不到任何富有成果的东西。
更新。 更好的问题是如何触发我的文档应用程序自动保存?
我发现我可以用 FileWrapper(regularFileWithContents: data).write( ... ) 之类的东西来保存我的文档,但这是一个坏主意,因为您的应用程序会给您一个错误,指出外部程序修改了文件。
使用 FileDocument 编写的 SwiftUI 文档应用程序协议(protocol)在某些事件上自动保存他们的文档,比如(取消)聚焦窗口,所以我想知道是否有办法以编程方式触发这样的自动保存。

最佳答案

遵循与 https://stackoverflow.com/a/68331797/16524160 类似的程序,我们可以尝试得到Save...使用的实现菜单项。看着

let menu = NSApp.mainMenu!.items.first(where: { $0.title == "File" })!
let submenu = menu.submenu!.items.first(where: { $0.title == "Save…" })!
submenu.target // nil
submenu.action // saveDocument:
我为 MyDocument 想出了以下方法:
func save() {
NSApp.sendAction(#selector(NSDocument.save(_:)), to: nil, from: nil)
}
备注 saveDocument已更名为 save .据我了解,这试图发送 save()选择键窗口中可以对其使用react的第一个对象。在我的情况下,关键窗口将包含用户正在编辑的文档,因此这将保存文档。

关于swift - 在 SwiftUI 文档应用程序中,如何从函数中保存文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68522523/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com