Проверка с несколькими UITextFields - PullRequest
2 голосов
/ 02 июля 2010

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

1 Ответ

8 голосов
/ 25 июля 2010

Вместо отображения 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;
}

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...