Как реализовать отмену с помощью 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 я не мог действительно отменить замену текста

575   2  

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

    Ничего не найдено.