1

问题

我正在使用 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)
    }
}

我试过的

我在网上搜索过,但没有发现任何帮助。

我尝试用 替换TextEditorTextField这解决了这个问题。但是只有一行的文本编辑区域不是我想要的。

我尝试了一个 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 来做到这一点,以及解决问题的最佳方法是什么。提前致谢。

4

0 回答 0