WindowGroup - ShenYj/ShenYj.github.io GitHub Wiki

WindowGroup

WindowGroup 是一个用于定义应用主界面的 Scene 类型。它是 SwiftUI 2.0 引入的重要特性,主要用于管理应用的窗口和界面层次

  • WindowGroup 是一个符合 Scene 协议的类型,用于定义应用的主窗口
  • 它允许多窗口支持(在 macOS 和 iPadOS 上),并且可以动态创建和管理多个窗口
  • 每个 WindowGroup 包含一个根视图(View),该视图会在窗口中显示

基本用法

WindowGroup 通常用于定义应用的主界面。以下是一个简单的示例

import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView() // 根视图
        }
    }
}

struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
    }
}

在这个例子中,WindowGroup 定义了一个主窗口,窗口内容为 ContentView。 当应用启动时,会自动创建一个窗口并显示 ContentView。

平台差异

  • macOS:
    • WindowGroup 支持多窗口,用户可以通过菜单栏或快捷键创建新窗口。
    • 窗口可以自由调整大小和位置。
  • iPadOS:
    • WindowGroup 支持多窗口,用户可以通过拖拽应用图标创建新窗口。
    • 每个窗口可以独立运行应用的不同部分。
  • iOS:
    • WindowGroup 主要用于定义主界面,不支持多窗口。

多窗口支持

WindowGroup 支持多窗口功能,用户可以在 macOS 或 iPadOS 上打开多个窗口。每个窗口都会独立显示 WindowGroup 中定义的视图

import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello, World!")
            Button("Open New Window") {
                // 在 macOS 或 iPadOS 上打开新窗口
                if let window = NSApplication.shared.windows.first {
                    let newWindow = NSWindow(
                        contentRect: NSRect(x: 0, y: 0, width: 400, height: 300),
                        styleMask: [.titled, .closable, .resizable],
                        backing: .buffered,
                        defer: false
                    )
                    newWindow.contentView = NSHostingView(rootView: ContentView())
                    newWindow.makeKeyAndOrderFront(nil)
                }
            }
        }
    }
}

在 macOS 上,用户可以通过菜单栏的 File -> New Window 打开新窗口。 在 iPadOS 上,用户可以通过拖拽应用图标到屏幕边缘来创建新窗口。

动态数据传递

WindowGroup 支持通过 @SceneStorage 或 @State 等属性包装器在多个窗口之间共享数据

import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    @SceneStorage("selectedTab") private var selectedTab: String = "Home"

    var body: some View {
        TabView(selection: $selectedTab) {
            Text("Home").tabItem { Text("Home") }.tag("Home")
            Text("Settings").tabItem { Text("Settings") }.tag("Settings")
        }
    }
}

在这个例子中,@SceneStorage 用于在多个窗口之间共享 selectedTab 状态。 当用户在不同窗口之间切换时,selectedTab 的值会保持一致。

自定义窗口行为

WindowGroup 允许通过 commands 和 onChange 等方法自定义窗口行为

import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .commands {
            CommandMenu("Custom Menu") {
                Button("Custom Action") {
                    print("Custom action triggered")
                }
            }
        }
        .onChange(of: NSApplication.shared.windows.count) { newValue in
            print("Number of windows: \(newValue)")
        }
    }
}

在这个例子中,commands 用于添加自定义菜单项。 onChange 用于监听窗口数量的变化

⚠️ **GitHub.com Fallback** ⚠️