Я хотел бы создать UIView, имеющий несколько UITextFields, проверяющих каждое из них, когда пользователь завершил редактирование.Контроллер представления является делегатом для каждого из полей UITextFields.Когда пользователь изменяет значение в одном из этих полей UITextFields и либо касается «готово» на клавиатуре, либо касается другого текстового поля в представлении, я сохраняю и проверяю изменение.Идея заключается в том, чтобы дать пользователю немедленную обратную связь и не позволять ему / ей продолжать работу, если там было введено неверное значение атрибута.
Я прочитал Руководство по текстовому и веб-программированию в документах поддержки 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 и правильно отображаете ошибку?