SwiftUI:更改 macOS 应用程序中的“关于视图”

ixa*_*any 5 nsmenu menuitem about-box swift swiftui

SwiftUI我正在使用新的生命周期构建 macOS 应用程序App

\n

我很想更改 \xe2\x80\x9cAbout Window\xe2\x80\x9d 的内容(当您点击 apps\xe2\x80\x99 中的 \xe2\x80\x9cAbout DemoApp\xe2\x80\x9d 时出现)菜单)但不知道如何:

\n

在此输入图像描述

\n

如何用自定义视图替换“关于”视图?

\n

hay*_*esk 9

您可以做到这一点,但它确实需要创建一个 AppDelegate。您的 AppFile 应该如下所示:

struct MyApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            MainView()
        }
        .commands {
            CommandGroup(replacing: CommandGroupPlacement.appInfo) {
                Button(action: {
                    appDelegate.showAboutPanel()
                }) {
                    Text("About My App")
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你的 AppDelegate 应该是这样的:

class AppDelegate: NSObject, NSApplicationDelegate {
    private var aboutBoxWindowController: NSWindowController?

    func showAboutPanel() {
        if aboutBoxWindowController == nil {
            let styleMask: NSWindow.StyleMask = [.closable, .miniaturizable,/* .resizable,*/ .titled]
            let window = NSWindow()
            window.styleMask = styleMask
            window.title = "About My App"
            window.contentView = NSHostingView(rootView: AboutView())
            aboutBoxWindowController = NSWindowController(window: window)
        }

        aboutBoxWindowController?.showWindow(aboutBoxWindowController?.window)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,只需创建一个名为 AboutView 的 SwiftUI 视图,它就会在您的“关于”框中显示该视图。例如:

struct AboutView: View {
    var body: some View {
        VStack {
            Spacer()
            HStack {
                Spacer()
                Text("Hello, World!")
                Spacer()
            }
            Spacer()
        }
        .frame(minWidth: 300, minHeight: 300)
    }
}
Run Code Online (Sandbox Code Playgroud)


dav*_*dev 8

您需要将 Credits.rtf 文件添加到您的 Bundle 中。这将被自动检测并插入到“关于”对话框中。

您可以在这里找到更多信息


And*_*rew 5

import Foundation\nimport SwiftUI\n\nstruct AboutView: View {\n    var body: some View {\n        VStack(spacing: 10) {\n            Image(nsImage: NSImage(named: "AppIcon")!)\n            \n            Text("\\(Bundle.main.appName)")\n                .font(.system(size: 20, weight: .bold))\n                // Xcode 13.0 beta 2\n                //.textSelection(.enabled)\n            \n            Link("\\(AboutView.offSiteAdr.replace(of: "http://", to: ""))", destination: AboutView.offCiteUrl )\n            \n            Text("Ver: \\(Bundle.main.appVersionLong) (\\(Bundle.main.appBuild)) ")\n                // Xcode 13.0 beta 2\n                //.textSelection(.enabled)\n            \n            Text(Bundle.main.copyright)\n                .font(.system(size: 10, weight: .thin))\n                .multilineTextAlignment(.center)\n        }\n        .padding(20)\n        .frame(minWidth: 350, minHeight: 300)\n    }\n}\n\n///////////////////////////////////\n/// HELPERS\n//////////////////////////////////\nclass AppDelegate: NSObject, NSApplicationDelegate {\n    private var aboutBoxWindowController: NSWindowController?\n    \n    func showAboutWnd() {\n        if aboutBoxWindowController == nil {\n            let styleMask: NSWindow.StyleMask = [.closable, .miniaturizable,/* .resizable,*/ .titled]\n            let window = NSWindow()\n            window.styleMask = styleMask\n            window.title = "About \\(Bundle.main.appName)"\n            window.contentView = NSHostingView(rootView: AboutView())\n            window.center()\n            aboutBoxWindowController = NSWindowController(window: window)\n        }\n        \n        aboutBoxWindowController?.showWindow(aboutBoxWindowController?.window)\n    }\n}\n\nextension AboutView {\n    private static var offSiteAdr: String { "http://www.taogit.com" }\n    private static var offEmail: String { "someUser@gmail.com" }\n    \n    public static var offCiteUrl: URL { URL(string: AboutView.offSiteAdr )! }\n    public static var offEmailUrl: URL { URL(string: "mailto:\\(AboutView.offEmail)")! }\n}\nextension Bundle {\n    public var appName: String { getInfo("CFBundleName")  }\n    //public var displayName: String {getInfo("CFBundleDisplayName")}\n    //public var language: String {getInfo("CFBundleDevelopmentRegion")}\n    //public var identifier: String {getInfo("CFBundleIdentifier")}\n    public var copyright: String {getInfo("NSHumanReadableCopyright").replace(of: "\\\\\\\\n", to: "\\n") }\n    \n    public var appBuild: String { getInfo("CFBundleVersion") }\n    public var appVersionLong: String { getInfo("CFBundleShortVersionString") }\n    //public var appVersionShort: String { getInfo("CFBundleShortVersion") }\n    \n    fileprivate func getInfo(_ str: String) -> String { infoDictionary?[str] as? String ?? "\xe2\x9a\xa0\xef\xb8\x8f" }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

并分配给菜单行:

\n
struct MyApp: App {\n    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate\n\n    var body: some Scene {\n        WindowGroup {\n            MainView()\n        }\n        // Replacement of standard About window\n        .commands {\n            CommandGroup(replacing: CommandGroupPlacement.appInfo) {\n                Button("About \\(Bundle.main.appName)") { appDelegate.showAboutWnd() }\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

结果:

\n

在此输入图像描述

\n

奖励:支持版权中的“\\n”

\n

在此输入图像描述

\n