macOS下WindowGroup未创建独立窗口问题排查
macOS下WindowGroup中@State未按文档保持窗口独立状态的问题
以下是初始测试代码:
@main struct so_tcaMultipleIndepententWindowsOnMacOSApp: App { var body: some Scene { WindowGroup { ContentViewVanilla() } } } struct ContentViewVanilla: View { @State private var id = UUID() var body: some View { Text(id.uuidString) } }
根据Apple官方文档对WindowGroup的说明,macOS下打开新窗口时,每个窗口应保持独立状态:
组中的每个窗口都保持独立状态。例如,系统会为每个创建的窗口,为场景视图层次结构中实例化的任何State或StateObject变量分配新的存储。
按文档预期,每次打开新窗口时UUID应不同,但实际在Xcode 15.1 + macOS 14.2环境下,所有新窗口显示的UUID完全一致。
编辑:使用StateObject可正常工作,但@State仍存在问题
将代码重构为使用持有UUID的ViewModel后,结果符合预期(每个新窗口的UUID独立):
@main struct so_tcaMultipleIndepententWindowsOnMacOSApp: App { var body: some Scene { WindowGroup { ContentViewVanilla() } } } struct ContentViewVanilla: View { @StateObject private var viewModel = ViewModel() var body: some View { Text(viewModel.id.uuidString) } } class ViewModel: ObservableObject { let id = UUID() }
我理解值类型与引用类型的区别,但根据Apple文档,原本无需单独创建class就能实现窗口状态独立。由于我希望使用基于struct而非class的TCA(Swift Composable Architecture),因此不想采用该方案。
根据其他用户反馈,在Xcode 15.0 + macOS 14.1.1环境下第一种方案可正常创建独立窗口,因此怀疑这是Apple堆栈中的bug,可能需要提交反馈,想了解更多相关思路。
内容的提问来源于stack exchange,提问作者appfrosch
相关产品推荐
相关产品推荐

