У меня были проблемы с этим в течение длительного времени. Я наконец понял, что вы должны убедиться, что регистрируете операцию отмены ПЕРЕД внесением каких-либо изменений в ваше хранилище текста.

у иметь возможность заменять некоторый текст в UITextView программно, поэтому я написал этот метод как категорию UITextView:

- (void) replaceCharactersInRange:(NSRange)range withString:(NSString *)newText{

    self.scrollEnabled = NO;

    NSMutableString *textStorage = [self.text mutableCopy];
    [textStorage replaceCharactersInRange:range withString:newText];

    //replace text but undo manager is not working well
    [[self.undoManager prepareWithInvocationTarget:self] replaceCharactersInRange:NSMakeRange(range.location, newText.length) 
                                                                       withString:[textStorage substringWithRange:range]];
    NSLog(@"before replacing: canUndo:%d", [self.undoManager canUndo]); //prints YES
    self.text = textStorage; 
    NSLog(@"after replacing: canUndo:%d", [self.undoManager canUndo]); //prints NO
    if (![self.undoManager isUndoing])[self.undoManager setActionName:@"replace characters"];
    [textStorage release];

    //new range:
    range.location = range.location + newText.length;
    range.length = 0;
    self.selectedRange = range;

    self.scrollEnabled = YES;

}

Это работает, но NSUndoManager перестает работать (кажется, сбрасывается) сразу после выполненияself.text=textStorage Я нашел частный API:-insertText:(NSString *) это может сделать работу, но кто знает, собирается ли Apple одобрить мое приложение, если я его использую. Есть ли способ заменить текст в UITextView с поддержкой NSUndoManager? А может я что-то здесь упускаю?

Ответы на вопрос(4)

Ваш ответ на вопрос