You need to add a Credits.rtf file to your Bundle. This will be automatically detect and be inserted in the About Dialog.
You can find more here
You can do it but it does require creating an AppDelegate. Here's what your AppFile should look like:
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")
}
}
}
}
}
and your AppDelegate Should Look like this:
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)
}
}
Then, just make a SwiftUI View named AboutView and it'll display that in your About Box. For Example:
struct AboutView: View {
var body: some View {
VStack {
Spacer()
HStack {
Spacer()
Text("Hello, World!")
Spacer()
}
Spacer()
}
.frame(minWidth: 300, minHeight: 300)
}
}
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 ?? "⚠️" }
}
And assign to menu line:
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() }
}
}
}
}
result:
Bonus: Support of "\\n" in Copyright
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.