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

SwiftUI冷启动时UndoManager为nil,切换视图后才可用的问题求助

问题:SwiftUI冷启动时UndoManager为nil,切换视图后才可用

SwiftUI应用冷启动时,@Environment(\.undoManager) 处于nil状态,必须等用户切换视图后才会被赋值,此时撤销功能才能正常工作。例如需切换至"Focus"视图再返回后,撤销功能才可用。

相关代码

视图中的环境变量与任务代码

@Environment(\.managedObjectContext) private var viewContext
@Environment(\.undoManager) private var undoManager
listOfCards.task{
    viewContext.undoManager = undoManager // 冷启动时undoManager为nil
}

App入口的持久化容器配置

mainView
    .environment(\.managedObjectContext, persistenceController.container.viewContext)

已尝试的无效方案

  • 方案A:使用.onChange监听undoManager变化
    尝试在每个视图中添加以下代码检测赋值并关联到viewContext,但未触发:

    .onChange(of: undoManager) { _ in
        print(undoManager)
        viewContext.undoManager = undoManager
    }
    
  • 方案B:监听NSUndoManager通知
    添加通知观察者,同样无效:

    private let undoObserver = NotificationCenter.default.publisher(for: .NSUndoManagerCheckpoint)
    
    .onReceive(undoObserver, perform: { _ in
        print(undoManager)
        viewContext.undoManager = undoManager
    })
    

目前仅切换至其他视图再返回后,UndoManager才能正常赋值。请问有何解决思路?是否遗漏了关键步骤?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:54:24