Переместить программный курсор в UiTextField - PullRequest
5 голосов
/ 30 июня 2010

Мне нужно настроить поведение UiTextField, чтобы я мог программно вставить несколько звездочек и переместить курсор в начало строки;Я попробовал трюк «вставить» (http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html),, но курсор перемещается в конце. Эффект, который я пытаюсь достичь, выглядит следующим образом: В начале:


, затем пользователь вставляетсимволы f ***** fo **** foo *** и т.д ...

Возможно ли это или трюки, которые я должен сделать, не заслуживают усилий?

Спасибо

-G- ​​

1 Ответ

7 голосов
/ 25 июня 2011

UPDATE:

В iOS5 и выше возможно сделать это, потому что UITextField и UITextView соответствуют UITextInput протоколу. Пожалуйста, взгляните на это: « Могу ли я выбрать определенный блок текста в UITextField? » для примера:).

Надеюсь, это поможет

<ч />

СТАРЫЙ ОТВЕТ: (iOS4.x и ниже):

Нет способа сделать это с помощью общедоступных API (не то, что я знаю). Однако я нашел несколько частных методов: (возможно недокументированные методы, потому что они не имеют префикса подчеркивания, который обычно имеют частные методы)

selectionRange
setSelectionRange:

Ниже код работает нормально (по крайней мере, в симуляторе 4.3), и я использую KVC, чтобы избежать раздражающих предупреждений. (self является экземпляром подкласса UITextField)

- (void) moveToRight{

    NSRange selectedRange = [[self valueForKey:@"selectionRange"] rangeValue];
    if (selectedRange.location != NSNotFound) {
        if (selectedRange.length > 0) {
            selectedRange.location = NSMaxRange(selectedRange);
            selectedRange.length = 0;
        }else if (selectedRange.location < self.text.length) {
            selectedRange.location += 1;
        }
        [self setValue:[NSValue valueWithRange:selectedRange] forKey:@"selectionRange"];
    }
}
- (void) moveToLeft{

    NSRange selectedRange = [[self valueForKey:@"selectionRange"] rangeValue];
    if (selectedRange.location != NSNotFound) {
        if (selectedRange.length > 0) {
            selectedRange.length = 0;
        }else if (selectedRange.location > 0) {
            selectedRange.location -= 1;
        }
        [self setValue:[NSValue valueWithRange:selectedRange] forKey:@"selectionRange"];
    }
}

Поскольку это не публичные API, используйте их на свой страх и риск, и я не знаю, пройдут ли они проверку Apple.

КСТАТИ: Я нашел их, используя:

#import "/usr/include/objc/objc-runtime.h"

unsigned int methodCount = 0;
Method *mlist = class_copyMethodList([UITextField class], &methodCount);
for (int i = 0; i < methodCount; ++i){
    NSLog(@"%@", NSStringFromSelector(method_getName(mlist[i])));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...