You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftUI中动态修改次级窗口的defaultSize?

解决动态修改SwiftUI次级窗口defaultSize的问题

要让App类中的WindowGroup响应单例的尺寸变化,关键是让App结构体监听单例的@Published属性,从而触发Scene的重新计算。以下是修改方案:

修改App类代码

在WindowSizeTestApp中添加对单例的@ObservedObject引用,这样当单例的windowWidth更新时,App的body会重新生成,进而更新WindowGroup的defaultSize:

import SwiftUI

@main
struct WindowSizeTestApp: App {
    @Environment(\.dismissWindow) private var dismissWindow
    @ObservedObject private var singleton = Singleton.shared // 监听单例的属性变化
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .defaultSize(CGSize(width: 300, height: 300))
        
        WindowGroup ("Second", id: "second") {
            SecondView()
        }
        .defaultSize(CGSize(width: singleton.windowWidth, height: 300)) // 使用监听的属性值
    }
}

原理说明

  • SwiftUI的App协议结构体的body会在其持有的@ObservedObject或@StateObject的@Published属性变化时重新计算。
  • 当你拖动滑块修改宽度时,单例的windowWidth会通过@Published发出更新通知,触发App的body刷新,此时WindowGroup的defaultSize会使用最新的宽度值。
  • 之后关闭并重新打开次级窗口时,系统会使用更新后的defaultSize来创建窗口。

其他代码无需修改

你的Singleton、ContentView和SecondView代码保持不变即可,因为它们的逻辑已经正确实现了值的传递和窗口的重新打开操作。

内容的提问来源于stack exchange,提问作者Jeffrey Berthiaume

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:50:04