Как реализовать отмену с помощью 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];
}
При выполнении undo я не мог действительно отменить замену текста
2 ответов:
From Cocoa Text Architecture Guide: text Editing-уведомления об изменении текста и сообщения делегатов:
По моему опыту, это включает в себя создание соответствующей операции отмены.Фактически внося изменения в текст, вы должны убедиться, что изменения правильно выполнены и записаны различными частями текстовой системы. Вы делаете это, заключая каждый пакет потенциальных изменений в скобки с помощью сообщений 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]; }
Сначала я попытался решить undo и shouldChangeTextInRange: replacementString: сделал трюк. Однако я обнаружил, что insertText: replacementRange: имеет тот же эффект.
[self insertText:attributedString replacementRange:range];Или:
if ([textView shouldChangeTextInRange:range replacementString:string]) { //string [textStorage beginEditing]; [textStorage replaceCharactersInRange:range withAttributedString:attributedString]; [textStorage endEditing]; [textView didChangeText]; }
Comments