2010-07-02 3 views
2

Я хотел бы создать UIView, поскольку несколько UITextFields проверяют каждый, когда пользователь выполнил его редактирование. Контроллер представления является делегатом для каждого из UITextFields. Когда пользователь изменяет значение в одном из этих UITextFields и либо прикасается к «сделанному» на клавиатуре, либо касается другого текстового поля в представлении, я сохраняю и проверяю изменение. Идея здесь заключается в том, чтобы дать пользователю немедленную обратную связь и не позволить ему продолжать действовать, если введено недопустимое значение атрибута.Валидация с несколькими UITextFields

Я прочитал Text and Web Programming Guide на документы поддержки Apple, которые предположили, что я ставлю логику сохранения/проверки в textFieldShouldEndEditing::

Лучшие методы делегирования для проверки введенных строк являются textFieldShouldEndEditing: для текстовых полей и textViewShouldEndEditing: для текстовых просмотров. Эти методы вызываются непосредственно перед текстовым полем или текстовым представлением, отменяющим статус первого ответчика. Возврат NO предотвращает это, и, следовательно, текстовый объект остается в центре внимания редактирования. Если введенная строка недействительна, вы также должны отобразить предупреждение, информирующее пользователя об ошибке.

Чтобы проверить это, я создал простой проект с одним UIView и двумя UITextFields. В документах все, что я делаю в этом тестовом проекте, отображает UIAlertView и возвращает NO. Вот метод:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField { 
    // return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end 
    NSLog(@"In function: textFieldShouldEndEditing:(UITextField *)textField (tag=%i)", textField.tag); 
    [self logFirstResponder]; 

    // PRETEND THAT THERE IS AN ISSUE THAT FAILS VALIDATION AND DISPLAY 
    // A UIALERTVIEW. 
    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Uh Oh!",@"") 
                 message:@"This is a test error" 
                 delegate:self 
               cancelButtonTitle:NSLocalizedString(@"OK",@"") 
               otherButtonTitles:nil]; 
    [errorAlert show]; 
    [errorAlert release]; 
    NSLog(@"Displaying Error UIAlertView!!!"); 

    // SINCE THE VALIDATION FAILED, RETURN NO TO HOLD THE USER IN THE 
    // UITEXTFIELD. 
    return NO; 
} 

И вот проблема: если пользователь нажмет от одной UITextField на другой, этот метод называется 3 раза и в результате появляется UIAlertView 3 раза. Вот консольный журнал из моих тестов:

-- Field One tag = 100, Field Two tag = 200 -- 

2010-07-02 09:52:57.971 test project[22866:207] In function: textFieldShouldBeginEditing:(UITextField *)textField (tag=100) 
2010-07-02 09:52:57.977 test project[22866:207] In function: textFieldDidBeginEditing:(UITextField *)textField (tag=100) 
2010-07-02 09:52:57.977 test project[22866:207] Field One is the First Responder. 

-- now i'm going to click from Field One into Field Two -- 

2010-07-02 09:53:18.771 test project[22866:207] In function: textFieldShouldBeginEditing:(UITextField *)textField (tag=200) 
2010-07-02 09:53:18.772 test project[22866:207] Field One is the First Responder. 
2010-07-02 09:53:18.774 test project[22866:207] In function: textFieldShouldEndEditing:(UITextField *)textField (tag=100) 
2010-07-02 09:53:18.774 test project[22866:207] Field One is the First Responder. 
2010-07-02 09:53:18.778 test project[22866:207] Displaying Error UIAlertView!!! 
2010-07-02 09:53:18.780 test project[22866:207] In function: textFieldShouldBeginEditing:(UITextField *)textField (tag=200) 
2010-07-02 09:53:18.781 test project[22866:207] Field One is the First Responder. 
2010-07-02 09:53:18.781 test project[22866:207] In function: textFieldShouldEndEditing:(UITextField *)textField (tag=100) 
2010-07-02 09:53:18.782 test project[22866:207] Field One is the First Responder. 
2010-07-02 09:53:18.783 test project[22866:207] Displaying Error UIAlertView!!! 

Так что же сделка? Кажется, что мне что-то не хватает ... Как вы проверяете UITextField и правильно отображаете ошибку?

ответ

8

Вместо отображения UIAlert вы можете вместо этого отображать значок ошибки в правой части текстового поля. Таким образом, если это произойдет 3 раза, это не приведет к появлению предупреждения, и пользователь не узнает, что этот значок установлен 3 раза. То, что я сделал, - установить правильное представление кнопкой с изображением, указывающим на ошибку. Я связываю кнопку с действием, которое показывает предупреждение, которое сообщает пользователю, что не так. Я создал вспомогательную функцию, которая добавляет кнопку изображения в правильное представление с действием.

- (void)setErrorForTextField:(UITextField *)textField target:(id)target action:(SEL)selector 
{ 
    CGRect frame = CGRectMake(0.0, 0.0, 15.0, 28.0); 
    UIImage *image = [UIImage imageNamed:@"ErrorIcon.png"]; 
    UIButton *button = [[[UIButton alloc] initWithFrame:frame] autorelease]; 
    [button setImage:image forState:UIControlStateNormal]; 
    button.backgroundColor = [UIColor clearColor]; 

    [button addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; 
    textField.rightView = button; 
    textField.rightViewMode = UITextFieldViewModeAlways; 
} 

My ErrorIcon.png бывает 15x28, поэтому я делаю кнопку такого размера. Я уверен, что кнопка и изображение соответствуют текстовому полю, хотя правильный вид уменьшит масштаб, если он слишком большой. Я установил его в правильном размере, не нужно ли масштабировать.

Вы можете скрыть и показать правильный вид в режиме, показанном в приведенном выше коде. Один режим всегда, а другой всегда. Есть другие способы, которые вы можете изучить.

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

Смежные вопросы