我希望能夠置換的UITextView的編程一些文字,所以我寫了這個方法的UITextView的類別:如何使用NSUndoManager支持替換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支持取代文本?或者我可能在這裏錯過了一些東西?
這不是100%正確。 'replaceRange:withText'將完成這項工作,而UITextInput協議確實可以從3.2版本獲得,但UITextView直到5.0版本才採用它。所以這個答案只適用於OS5.0及以上版本 – nacho4d
我根據@ nacho4d的評論更新了我的答案。接得好。 – mightylost
是的,這是iOS 5的方式。 –