NSUndoManager 和替换/跳过撤消步骤



有没有办法告诉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];
}];

但是,重做可能会在这里造成伤害,因为整个受影响的字符串可能不会通过文本视图的内部方法注册。

相关内容

  • 没有找到相关文章

最新更新