问题
我正在使用 Xcode 13.2.1 在 macOS (12.0.1) 上开发一个简单的基于 SwiftUI 文档的应用程序。
在我的应用程序中,我TextEditor
在文档视图中需要两个 s。一个显示文档的内容,另一个用于支持一些其他的功能。
令我困扰的是,在这些文本编辑器中进行编辑时,文档被设置为已编辑,就像在这个屏幕截图中一样。我想知道是否有办法阻止第二个TextEditor
这样做。
代码
这是DocumentView
用 2TextEditor
秒显示文档。只有第一个用于显示文档内容。
struct DocumentView: View {
@Binding var document: Document
@State private var string = ""
var body: some View {
TextEditor(text: $document.text)
TextEditor(text: $string)
}
}
应用程序的代码和文档结构与 Xcode 模板相同:
import SwiftUI
@main
struct SwiftUIApp: App {
var body: some Scene {
DocumentGroup(newDocument: CPDocument()) { a in
DocumentView(document: a.$document)
}
}
}
import SwiftUI
import UniformTypeIdentifiers
struct Document: FileDocument {
var text: String
init(text: String = "Document Content") {
self.text = text
}
static var readableContentTypes: [UTType] { [.plainText] }
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)
}
}
我试过的
我在网上搜索过,但没有发现任何帮助。
我尝试用 替换TextEditor
,TextField
这解决了这个问题。但是只有一行的文本编辑区域不是我想要的。
我尝试了一个 hacky 解决方案,即在编辑后保存文档,但应用程序崩溃并显示错误消息Performing @selector(saveDocument:) from sender __SwiftValue 0x600003efac40
。
TextEditor(text: $string)
.onChange(of: string) { _ in
NSApp.sendAction(#selector(NSDocument.save(_:)), to: NSApp.keyWindow?.windowController?.document, from: self)
}
我想知道是否可以使用纯 SwiftUI 来做到这一点,以及解决问题的最佳方法是什么。提前致谢。