SwiftUI TextEditor,撤消过程中导航更改发生异常

时间:2020-08-13 14:57:48

标签: swift swiftui

我的应用程序使用许多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中,但是行为是相同的。

0 个答案:

没有答案