Проблема производительности, имитирующая нажатие клавиш в UITextView - PullRequest
3 голосов
/ 02 апреля 2011

Я использую следующий код для имитации нажатия клавиши в UITextView (а также для установки прокрутки в положение вставки):

NSRange selectedRange = textview.selectedRange;

NSString *currentText = textview.text;

NSString *yourString = @"x";

NSString *firstPart = [currentText substringToIndex: selectedRange.location];
NSString *lastPart = [currentText substringFromIndex: selectedRange.location];

NSString *modifiedText = [firstPart stringByAppendingFormat:@"%@%@", yourString, lastPart];

textview.text = modifiedText;

NSInteger loc = selectedRange.location + 1;
NSInteger len = textview.selectedRange.length;

NSRange newRange = NSMakeRange(loc, len);
textview.selectedRange = newRange;

Как вы можете видеть, я делю textview.text,я вставляю @ "x" в позицию курсора и изменяю весь текст.На самом деле, это прекрасно работает, если длина текстового файла не велика.И это звучит логично, учитывая, что я делю все это на части и так с каждым симулируемым ключом.

Так что с небольшим текстовым файлом у меня нет никаких проблем, но с большим я могу видеть значительное отставание.

Есть ли способ сделать это с лучшей производительностью?

1 Ответ

4 голосов
/ 02 апреля 2011

Вместо того, чтобы переписывать весь текст при каждом нажатии клавиши, вы должны использовать метод
-(void)insertText:(NSString*)text

Пример кода из здесь :

@interface UIResponder(UIResponderInsertTextAdditions)
- (void) insertText: (NSString*) text;
@end

@implementation UIResponder(UIResponderInsertTextAdditions)

- (void) insertText: (NSString*) text
{
    // Get a refererence to the system pasteboard because that's
    // the only one @selector(paste:) will use.
    UIPasteboard* generalPasteboard = [UIPasteboard generalPasteboard];

    // Save a copy of the system pasteboard's items
    // so we can restore them later.
    NSArray* items = [generalPasteboard.items copy];

    // Set the contents of the system pasteboard
    // to the text we wish to insert.
    generalPasteboard.string = text;

    // Tell this responder to paste the contents of the
    // system pasteboard at the current cursor location.
    [self paste: self];

    // Restore the system pasteboard to its original items.
    generalPasteboard.items = items;

    // Free the items array we copied earlier.
    [items release];
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...