Russian (Pусский) translation by Sergey Oleynich (you can also view the original English article)
С выходом новой версии iOS 5 SDK, UIAlertView class был обновлен до встроенной поддержки текстовых полей для ввода текста, ввода скрытого текста и для ввода логина/пароля. Этот небольшой урок покажет Вам, как использовать преимущества этих новых усовершенствований!
В предыдущей статье для начинающих, я провел читателя через настройки проекта с созданием пользовательской кнопки и фона. Я воспользуюсь проектом, созданным в том уроке как отправной точкой для этого проекта.
Введение в Alert View Styles
Компоновка и форма элементов UIAlertView
могут легко и быстро контролироваться настройками свойств alertViewStyle
. Возможные значения этих настроек включают в себя следующие:
UIAlertViewStylePlainTextInput
Этот стиль добавит одно поле для ввода текста в Ваш Alert View:

UIAlertViewStyleSecureTextInput
Этот стиль напоминает стиль с обычным полем для ввода текста за исключением того что все символы скрываются:

UIAlertViewStyleLoginAndPasswordInput
Установка этого значения в качестве свойств стиля добавит как поле для ввода логина, так и секретное поле для ввода пароля:

UIAlertViewStyleDefault
Это стиль по умолчанию, который мы уже изучили и полюбили:

Реализация
Любой из выше перечисленных стилей легко реализовать настройкой свойств alertViewStyle
Вашего UIAlertView
, как с помощью точечного вызова:
message.alertViewStyle = UIAlertViewStylePlainTextInput;
так и с помощью вызова сеттер метода:
[message setAlertViewStyle:UIAlertViewStylePlainTextInput];
Вот и все! После того как Вы установите эти свойства, Ваш Alert View отобразиться соответствующим образом.
Конечно же, отображение поля для ввода текста в Alert View хорошо, но еще лучше, если Вы также можете иметь доступ к значениям, которые введены пользователем. Это возможно при использовании методаtextFieldAtIndex:
. Вы только указываете индекс полю для ввода текста, к которому хотите получить доступ (0 – 1 в примерах выше), и соответствующий объект из UITextField
будет возвращен.
На примере того как это должно работать рассмотрим делегатный метод -alertView:clickedButtonAtIndex:
, который мы уже реализовали в прилагаемом демо проекте. Если мы изменим стиль Alert View на UIAlertViewStyleLoginAndPasswordInput
и поменяем заглавие кнопки на "Login", то мы сможем получить доступ к значениям введённые пользователем в делегатном методе, следующим образом:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; if([title isEqualToString:@"Login"]) { UITextField *username = [alertView textFieldAtIndex:0]; UITextField *password = [alertView textFieldAtIndex:1]; NSLog(@"Username: %@\nPassword: %@", username.text, password.text); } }
Возможные ловушки
Есть несколько способов, при которых использование новых стилей Alert View могут иметь неприятные последствия.
Слишком много кнопок
Если Вы добавите не менее трех кнопок вUIAlertView
, компоновка каждого нового стиля станет искаженной.

Каждый из новых стилей может спокойно обрабатывать 2 кнопки, но стиль по умолчанию, который использовался ранее, может обрабатывать до 6 кнопок, в том случае если заголовок и сообщение убраны:

Слишком много текста
Стиль UIAlertViewStyleLoginAndPasswordInput
не может обрабатывать поле для ввода текста также хорошо, как это делают другие стили:

Даже введя такое краткое сообщение как «Вы должны заполнить оба поля логин и пароль» будет достаточно для того чтобы вся запись не вместилась в соответствующем поле.
Валидация ввода
В дополнении к обсуждаемым стилям, в iOS 5 SDK введен новый метод UIAlertViewDelegate
, который называется -alertViewShouldEnableFirstOtherButton:
. Этот метод вызывается в двух случаях: когда Ваш Alert View появляется в первый раз, а также все время, когда пользователь печатает символ в одном из полей для ввода текста, что позволяет с легкостью выполнить в начале проверку вводимых символов, а после принять их в качестве значений пользователя.
Рассмотрим это на следующем примере:
- (IBAction)showMessage:(id)sender { UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"What is your phone number?" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Continue", nil]; [message setAlertViewStyle:UIAlertViewStylePlainTextInput]; [message show]; } - (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView { NSString *inputText = [[alertView textFieldAtIndex:0] text]; if( [inputText length] >= 10 ) { return YES; } else { return NO; } }
Код приведенный выше позволить пользователю нажать кнопку «Дальше» только лишь после того как он введет не менее 10 символов в поле для ввода текста. Я уверен, что Вы захотите усложнить Вашу собственную валидацию данных, но этот простой пример всего лишь показывает, каким полезным может быть данный метод.