2009-06-18 5 views
11

У меня есть UITextField в моем приложении. Я хотел бы ограничить набор символов, которые могут быть введены в поле, в набор, который я определил. Я мог фильтровать символы, введенные в поле, когда текст совершается с использованием метода UITextFieldDelegate:Фильтрация символов, введенных в UITextField

- (BOOL)textFieldShouldReturn:(UITextField*)textField 

Однако это дает пользователю ложное впечатление, как хотя недопустимых символов удаляются из конечного значения, они все еще были заметно введите в текстовое поле, прежде чем нажать Return/Done/etc. Каков наилучший подход, который предотвращает появление символов ограничения в текстовом поле, как они выбраны на клавиатуре?

Примечание: Я работаю в предположении, что у меня мало контроля над ключами, которые предоставляются клавиатурой iPhone. Я знаю, что я могу переключаться между различными реализациями клавиатуры, но мне кажется, что я не могу отключить определенные ключи. Это предположение может быть неверным.

ответ

13

Посмотрите на textField:shouldChangeCharactersInRange

Этот метод вызывается всякий раз, когда UITextFieldDelegate новые символы набранного или существующие символы будут удалены из текстового поля. Вы можете вернуть НЕТ, чтобы не допустить изменения.

+2

Пример кода для этого ответа можно найти здесь: http://stackoverflow.com/questions/1013647/filtering-characters-entered-into-a-uitextfield/1015262#1015262 – teabot

+2

Приятная работа, добавляющая URL-адрес вашего ответа, который прямо под этим. +1 – uerceg

2

Посмотрите на метод UITextViewDelegate- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string.

Это именно то, что вам нужно.

-6

Вы можете установить цикл и продолжить проверку, изменилось ли свойство UITextField.text после вызова метода DidBeginEditing. Если он есть, проверьте текст и удалите плохие символы.

+1

Это будет использовать слишком много ресурсов. – evilgoldfish

25

Я сделал так, как предполагалось, и это сработало хорошо. Далее следует реализация примера.

Примечание: имена переменных были выбраны для краткости и не отражают мои стандарты кодирования:

... 
    myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"xyzXYZ"]; 
    ... 
} 

- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered { 
    for (int i = 0; i < [textEntered length]; i++) { 
     unichar c = [textEntered characterAtIndex:i]; 
     if (![myCharSet characterIsMember:c]) { 
      return NO; 
     } 
    } 
    return YES; 
} 
+1

нет необходимости перебирать все символы в textEntered.вы можете просто проверить unichar c = [textEntered characterAtIndex: [textEntered length] - 1]; вам не нужен цикл for – 2011-07-18 18:13:12

+0

, и вам также нужно убедиться, что он возвращает yes, когда введен символ возврата. – 2011-07-18 18:16:21

+2

@PatrickAnarna: проверка последнего символа недостаточна. 'textEntered' может быть вложенным фрагментом текста с более чем одним символом. –

3

Вот один из самых экологически чистых подходов к ограничению символы, вводимые в UITextField. Этот подход позволяет использовать несколько предопределенных наборов NSCharacterSets.

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 

    NSMutableCharacterSet *allowedCharacters = [NSMutableCharacterSet alphanumericCharacterSet]; 
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; 
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]]; 

    if([string rangeOfCharacterFromSet:allowedCharacters.invertedSet].location == NSNotFound){ 

     return YES; 

    } 

    return NO; 

} 
1

Это то, что я использую, чтобы ограничить пользователя прописными буквами A-Z. Отрегулируйте переменную регулярного выражения в соответствии со вкусом:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString* regex = @"[^A-Z]"; 
    return ([string rangeOfString: regex 
         options:NSRegularExpressionSearch].location == NSNotFound); 
}; 
+1

. Точка с запятой после «regex» не должна быть там. – Koen

+0

Отредактировано для сообщения с запятой. –

0

Как насчет этого?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSString* regex = @"[^a-z]"; 
    return ([[string lowercaseString] rangeOfString: regex 
         options:NSRegularExpressionSearch].location == NSNotFound); 
}; 

Примечание:

творю все символы в нижнем регистре [string lowercaseString] так, что вам не нужно писать в регулярных выражениях для Captial/строчных букв.