如何在不启动文件选择器的情况下制作 SwiftUI DocumentGroup 应用程序?

MSc*_*ler 9 swiftui ios14 documentgroup

如果用户使用 Xcode 中的 Document App 模板创建 SwiftUI 应用程序,macOS 会使用新文档启动他们。这很好。我可以使用它在新文档中显示入职 UI。

但是,在 iOS 上运行相同的应用程序时,用户会收到股票文档视图控制器的欢迎,以创建或选择文档。

这没有帮助,因为我没有办法展示入职信息或任何其他自定义信息。

我确实注意到,如果您将 WindowGroup 添加到场景中,应用程序将显示该窗口组。但是我不知道如何让用户进入选择器 UI。

有没有人想出如何在这个基于 DocumentGroup 的应用程序上做一些事情?

这是一个完整的文档应用程序

import SwiftUI
import UniformTypeIdentifiers

@main
struct DocumentTestApp: App {
    var body: some Scene {
        DocumentGroup(newDocument: DocumentTestDocument()) { file in
            ContentView(document: file.$document)
        }
    }
}

struct ContentView: View {
    @Binding var document: DocumentTestDocument

    var body: some View {
        TextEditor(text: $document.text)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(document: .constant(DocumentTestDocument()))
    }
}

extension UTType {
    static var exampleText: UTType {
        UTType(importedAs: "com.example.plain-text")
    }
}

struct DocumentTestDocument: 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

MSc*_*ler 2

看起来从 iOS 16 开始,这已经可以实现了,这里有文档

@main
struct Mail: App {
    var body: some Scene {
        WindowGroup(id: "mail-viewer") {
            MailViewer()
        }
    }
}


struct NewViewerButton: View {
    @Environment(\.openWindow) private var openWindow


    var body: some View {
        Button("Open new mail viewer") {
            openWindow(id: "mail-viewer")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当场景出现时,您可以在登录窗口中打开。