簡體   English   中英

使 SwiftUI 應用出現在 macOS Dock 中

[英]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 管理器構建應用程序。 以下是我正在使用的最小項目的文件:

Package.swift
// 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>
主要.swift
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM