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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:22:49