WindowGroup - ShenYj/ShenYj.github.io GitHub Wiki
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 用于监听窗口数量的变化