【问题标题】:How do I display User Guides from my Help menu in my SwiftUI Mac app?如何在 SwiftUI Mac 应用程序的帮助菜单中显示用户指南?
【发布时间】:2021-12-20 09:50:34
【问题描述】:

我编写了一个 SwiftUI 应用程序并将其发布在 Mac App Store 上。我还编写了详细的用户指南和各种技术指南,以帮助用户了解如何使用该应用程序并解释其显示。所有这些 .md 文件都包含在我的应用程序中。如何允许帮助菜单打开和显示这些文件?

【问题讨论】:

    标签: ios swift macos swiftui


    【解决方案1】:

    我不知道其他人是怎么做到的,但这是我会使用的方法:

    import SwiftUI
    
    
    @main
    struct MacApp: App {
        @State var showHelp = false
        
        var body: some Scene {
            WindowGroup {
                ContentView()
                    .sheet(isPresented: self.$showHelp) { HelpView() }
            }.commands {
                CommandGroup(replacing: .help) {
                    Button(action: {showHelp = true}) {
                        Text("App Help")
                    }
                }
            }
        }
    }
    

    对于 iOS:

    @main
    struct IOSApp: App {
        @State var showHelp = false
    
        var body: some Scene {
            WindowGroup {
                ContentView(showHelp: $showHelp)
                    .sheet(isPresented: self.$showHelp) { HelpView() }
            }
        }
    }
    

    传递showHelp(或作为ObservableObject/EnvironmentObject), 然后设置showHelp=true,当单击带有Image(systemName: "info.circle") 的按钮时 例如。

    struct HelpView: View {
        @Environment(\.dismiss) var dismiss
        
        @State var mdText = AttributedString()
        
        var body: some View {
            VStack (alignment: .leading, spacing: 20) {
                Button(action: {dismiss()}) {
                    Text("Done").foregroundColor(.blue)
                }.padding(10)
                ScrollView {
                    Text("Welcome to my app help")
                    Text(mdText)
                }.frame(width: 333, height: 333)
            }
            .onAppear {
                // get your .md files contents
                do {
                    mdText = try AttributedString(markdown: "***help file contents***")
                } catch {
                    // error
                }
            }
        }
    }
    

    EDIT1:读取您的应用程序中包含的md 文件。

        .onAppear {
            var str: String = ""
            if let mdFile = Bundle.main.path(forResource: "README", ofType: "md") {
                do {
                    str = try String(contentsOfFile: mdFile)
                    mdText = try AttributedString(markdown: str)
                } catch {
                    // deal with error
                }
            }
        }
    

    EDIT2:iOS 应用的 ContentView:

    struct ContentView: View {
        @Binding var showHelp: Bool  // <--- here
        
        var body: some View {
            Button(action: {showHelp = true}) {
              VStack {
                Image(systemName: "info.circle").resizable().frame(width: 60, height: 60)
                Text("Info").font(.caption)
              }.foregroundColor(Color.blue)
            }
        }
    }
    

    【讨论】:

    • 感谢您的解决方案。它完美地工作。我需要一个细节方面的帮助:在您的try AttributedString(markdown: "***help file contents***") 行中,如何将文件路径插入到我的文档中 - 例如filepath = Bundle.main.url(forResource: "README", withExtension: "md")
    • 通过阅读您的 README.md 文件更新了我的答案。
    • 再次感谢您的帮助。我实际上正在开发一个多平台应用程序。您的解决方案适用于 macOS,但 Xcode 抱怨 ContentView “正在传递给 iOS 的不带参数的调用”。对于 iOS,我的 ContentView 会是什么样子? iPhone 用户应该怎么做才能查看 md 文件?
    • 更新了我对 ios ContentView 的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2023-04-10
    • 2017-05-02
    • 1970-01-01
    • 2011-04-27
    • 2014-08-05
    相关资源
    最近更新 更多