Я хотел бы создать 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 и правильно отображаете ошибку?