您可以这样做,但需要创建一个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")
}
}
}
}
}
你的 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)
}
}
然后,只需创建一个名为AboutView的SwiftUI视图,它将在您的关于框中显示。例如:
struct AboutView: View {
var body: some View {
VStack {
Spacer()
HStack {
Spacer()
Text("Hello, World!")
Spacer()
}
Spacer()
}
.frame(minWidth: 300, minHeight: 300)
}
}
你需要在你的Bundle中添加一个名为Credits.rtf的文件。这个文件会被自动检测并插入到关于对话框中。
你可以在这里找到更多信息。
import Foundation
import SwiftUI
struct AboutView: View {
var body: some View {
VStack(spacing: 10) {
Image(nsImage: NSImage(named: "AppIcon")!)
Text("\(Bundle.main.appName)")
.font(.system(size: 20, weight: .bold))
// Xcode 13.0 beta 2
//.textSelection(.enabled)
Link("\(AboutView.offSiteAdr.replace(of: "http://", to: ""))", destination: AboutView.offCiteUrl )
Text("Ver: \(Bundle.main.appVersionLong) (\(Bundle.main.appBuild)) ")
// Xcode 13.0 beta 2
//.textSelection(.enabled)
Text(Bundle.main.copyright)
.font(.system(size: 10, weight: .thin))
.multilineTextAlignment(.center)
}
.padding(20)
.frame(minWidth: 350, minHeight: 300)
}
}
///////////////////////////////////
/// HELPERS
//////////////////////////////////
class AppDelegate: NSObject, NSApplicationDelegate {
private var aboutBoxWindowController: NSWindowController?
func showAboutWnd() {
if aboutBoxWindowController == nil {
let styleMask: NSWindow.StyleMask = [.closable, .miniaturizable,/* .resizable,*/ .titled]
let window = NSWindow()
window.styleMask = styleMask
window.title = "About \(Bundle.main.appName)"
window.contentView = NSHostingView(rootView: AboutView())
window.center()
aboutBoxWindowController = NSWindowController(window: window)
}
aboutBoxWindowController?.showWindow(aboutBoxWindowController?.window)
}
}
extension AboutView {
private static var offSiteAdr: String { "http://www.taogit.com" }
private static var offEmail: String { "someUser@gmail.com" }
public static var offCiteUrl: URL { URL(string: AboutView.offSiteAdr )! }
public static var offEmailUrl: URL { URL(string: "mailto:\(AboutView.offEmail)")! }
}
extension Bundle {
public var appName: String { getInfo("CFBundleName") }
//public var displayName: String {getInfo("CFBundleDisplayName")}
//public var language: String {getInfo("CFBundleDevelopmentRegion")}
//public var identifier: String {getInfo("CFBundleIdentifier")}
public var copyright: String {getInfo("NSHumanReadableCopyright").replace(of: "\\\\n", to: "\n") }
public var appBuild: String { getInfo("CFBundleVersion") }
public var appVersionLong: String { getInfo("CFBundleShortVersionString") }
//public var appVersionShort: String { getInfo("CFBundleShortVersion") }
fileprivate func getInfo(_ str: String) -> String { infoDictionary?[str] as? String ?? "⚠️" }
}
将其分配给菜单行:
struct MyApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
MainView()
}
// Replacement of standard About window
.commands {
CommandGroup(replacing: CommandGroupPlacement.appInfo) {
Button("About \(Bundle.main.appName)") { appDelegate.showAboutWnd() }
}
}
}
}
结果:
附加奖励:支持版权中的"\n"