如何使用NSTextview实现撤消

Joh*_*tty 6 macos objective-c undo-redo nstextview

我想在替换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];
}
Run Code Online (Sandbox Code Playgroud)

执行撤消时,我无法撤消文本替换

Ken*_*ses 8

来自Cocoa Text Architecture Guide:文本编辑 - 文本更改通知和委托消息:

在实际更改文本时,必须确保更改由文本系统的不同部分正确执行和记录.您可以使用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];
}
Run Code Online (Sandbox Code Playgroud)