如何在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
相关产品推荐
相关产品推荐

