Objective c 如何使用NSTextview实现撤消

Objective c 如何使用NSTextview实现撤消,objective-c,macos,nstextview,undo-redo,Objective C,Macos,Nstextview,Undo Redo,我想在替换NSTextView中的部分文本后实现撤消操作。我用以下代码替换部分文本 - (void)omeAction { NSString *fullString = [self.textView string]; NSRange selectedRange = [self.textView selectedRange]; NSString *selectedString = [fullString substringWithRange:selectedRange];

我想在替换NSTextView中的部分文本后实现撤消操作。我用以下代码替换部分文本

- (void)omeAction
{
    NSString *fullString = [self.textView string];
    NSRange selectedRange = [self.textView selectedRange];
    NSString *selectedString = [fullString substringWithRange:selectedRange];

    NSString *stringToReplace = ...;
    [[self.textView textStorage] beginEditing];
    [[self.textView  textStorage] replaceCharactersInRange:selectedRange withString:stringToReplace];
    [[self.textView textStorage] endEditing];
}
执行撤消时,我无法从以下位置撤消文本替换:

在实际更改文本时,必须确保文本系统的不同部分正确执行和记录了更改。通过使用shouldChangeTextInRange:replacementString:和didChangeText消息将每批潜在更改括起来,可以实现这一点。这些方法确保发送适当的代理消息并发布通知

根据我的经验,这包括生成相关的撤消操作

那么,你会做:

if ([self.textView shouldChangeTextInRange:selectedRange replacementString:stringToReplace])
{
    [[self.textView textStorage] beginEditing];
    [[self.textView textStorage] replaceCharactersInRange:selectedRange withString:stringToReplace];
    [[self.textView textStorage] endEditing];
    [self.textView didChangeText];
}

首先,我尝试解决撤销问题,shouldChangeTextInRange:replacementString:成功了。但是,我发现insertText:replacementRange:具有相同的效果

[self insertText:attributedString replacementRange:range];
或:


抱歉,没有读完整的问题。我以为这是一般意义上的撤销(模糊的问题标题)。在我的例子中,撤销根本不起作用,结果是nstextview根本没有注册某些密钥事件。谢谢,shouldChangeTextInRange有助于启动正确的撤消工作
if ([textView shouldChangeTextInRange:range replacementString:string]) { //string
  [textStorage beginEditing];
  [textStorage replaceCharactersInRange:range withAttributedString:attributedString];
  [textStorage endEditing];
  [textView didChangeText];
}