我希望能够通过编程方式替换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;
}
这个方法可以工作,但是在执行self.text=textStorage
之后,NSUndoManager停止工作(似乎被重置了)。我找到了一个私有的API:-insertText:(NSString *)
,它可以完成这项工作,但谁知道如果我使用它,苹果是否会批准我的应用程序。有没有什么办法在具有NSUndoManager支持的UITextView中替换文本?或者我可能错过了什么吗?
replaceRange:withText
可以完成任务,UITextInput协议确实从3.2开始就可用了,但UITextView直到5.0才采用它。因此,这个答案只适用于OS5.0及以上版本。 - nacho4d