我的应用程序使用许多TextEditor,它们绑定到我的数据模型中的实践。导航窗格会更改查看的实践。撤消是在我的数据模型中实现的,如下所示:
/// Set the evidence for the given practice - called from Binding set
func setPracticeEvidence(practice: SpicePracticeRating, evidence: String, undoManager: UndoManager?) {
let oldEvidence = practice.evidence
practice.evidence = evidence
// Register the undo
undoManager?.registerUndo(withTarget: practice) { target in
self.setPracticeEvidence(practice: target, evidence: oldEvidence, undoManager: undoManager)
}
undoManager?.setActionName("Practice Evidence")
objectWillChange.send()
}
只要不更改导航,撤消和重做就可以工作。导航更改后的第一次撤消将导致异常。撤消堆栈似乎指向与TexEditor相关的NSConcreteTextStorage,而不是我期望的数据模型。 SwiftUI当然会在导航更改时重新创建TexEditor,因此目标不再有效。
Undo stack, count: 3
Stack head: Optional(target: NSConcreteTextStorage 0x7fe86e134ff0 -- selector:_undoRedoTextOperation: -- arg:NSUndoTyping 0x600001b25b80)
您认为我的诊断是正确的。有办法解决这个问题吗?
在程序的PC版本上,我基本上将撤消定向到数据模型,并让视图跟随模型中的更改。我还没有想出如何在SwiftUI中做到这一点,有什么建议吗?
我也尝试过将NSTextView包装在NSViewRepresentable中而不是TextEditor中,但是行为是相同的。