[英]Make SwiftUI app appear in the macOS Dock
我是 macOS UI 编程的完全菜鸟。 我上次这样做是在 20 世纪的某个时候,使用 Visual Mac Standard Basic 或 REALbasic……
我正在尝试构建一个图形用户界面,以使用 SwiftUI 与 Swift 中编写的一些算法进行交互。我不打算分发可运行的应用程序包,而是应该使用swift run
或类似命令从命令行启动 GUI。
我已经设法得到一个 window,我的 UI 显示在屏幕上,但它并没有真正起作用。 当从命令行运行可执行文件并单击 window 使其看起来像最前面的 window 时,它不会获得焦点,但来自Terminal.app的 window 仍然具有焦点并接收击键。 Dock 中没有应用程序图标(即使是通用图标),我无法使用 Command-Tab 切换到应用程序。
在这方面,我缺少什么才能从应用程序中获得通常的行为?
我使用的是 macOS 10.15.7 和 Xcode 12.4。 我希望从命令行使用Swift Package 管理器构建应用程序。 以下是我正在使用的最小项目的文件:
// swift-tools-version:5.3
import PackageDescription
let linkerFlags = [
"-Xlinker", "-sectcreate",
"-Xlinker", "__TEXT",
"-Xlinker", "__info_plist",
"-Xlinker", "Resources/Info.plist"]
let package = Package(
name: "ConnectedRegions",
platforms: [.macOS(.v10_15)],
products: [
.executable(name: "ConnectedRegions", targets: ["ConnectedRegions"])],
targets: [
.target(
name: "ConnectedRegions",
linkerSettings: [.unsafeFlags(linkerFlags)])])
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
import Cocoa
import SwiftUI
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ notification: Notification) {
let window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 200, height: 200),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered,
defer: false)
window.center()
window.contentView = NSHostingView(rootView: Text("Hello").padding(50))
window.makeKeyAndOrderFront(nil)
}
}
let delegate = AppDelegate()
NSApplication.shared.delegate = delegate
_ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
使用 macOS 11 中来自SwiftUI
的新App
协议,它提供了一个入口点,这很容易实现。 无需Info.plist
即可获得默认菜单和 Dock 图标:
import SwiftUI
@main
struct MyApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
VStack {
Button("Done") { exit(0) }
}
.padding(100)
}
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ notification: Notification) {
NSApplication.shared.setActivationPolicy(.regular)
NSApplication.shared.activate(ignoringOtherApps: true)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.