有没有办法告诉undoManager
在某些情况下,撤消步骤在编辑发生之前已经提交?
我有一个应用程序,它会自动用大写对应项替换某些字符串。问题是,这必须自动完成textStorage
,因此在撤消编辑时,文本保持大写。
我已经为相关操作编写了自定义撤消状态,这些状态是在NSTextView shouldChangeTextInRange
中创建的:
例如:
[[self.undoManager prepareWithInvocationTarget:self]
replaceCharactersInRange:
NSMakeRange(affectedCharRange.location + affectedCharRange.length, string.length + 1) withString:string
];
我希望undoManager
忽略编辑后将收到的撤消步骤。
一种方法是使用[self.undoManager disableUndoRegistration];
禁用NSUndoManager
记录撤消步骤。然后,在操作完成后,您可以使用[self.undoManager enableUndoRegistration]
再次启用它。
这似乎是一种有点危险的方法,因为它确实会弄乱您的撤消堆栈。
我通过在注册NSTextView
撤消之前执行额外的撤消步骤来解决此问题:
[self.undoManager registerUndoWithTarget:self handler:^(id _Nonnull target) {
[self replaceCharactersInRange:undoStringRange withString:undoString];
}];
但是,重做可能会在这里造成伤害,因为整个受影响的字符串可能不会通过文本视图的内部方法注册。