() translation by (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
, как с помощью точечного вызова:
1 |
message.alertViewStyle = UIAlertViewStylePlainTextInput; |
так и с помощью вызова сеттер метода:
1 |
[message setAlertViewStyle:UIAlertViewStylePlainTextInput]; |
Вот и все! После того как Вы установите эти свойства, Ваш Alert View отобразиться соответствующим образом.
Конечно же, отображение поля для ввода текста в Alert View хорошо, но еще лучше, если Вы также можете иметь доступ к значениям, которые введены пользователем. Это возможно при использовании методаtextFieldAtIndex:
. Вы только указываете индекс полю для ввода текста, к которому хотите получить доступ (0 – 1 в примерах выше), и соответствующий объект из UITextField
будет возвращен.
На примере того как это должно работать рассмотрим делегатный метод -alertView:clickedButtonAtIndex:
, который мы уже реализовали в прилагаемом демо проекте. Если мы изменим стиль Alert View на UIAlertViewStyleLoginAndPasswordInput
и поменяем заглавие кнопки на "Login", то мы сможем получить доступ к значениям введённые пользователем в делегатном методе, следующим образом:
1 |
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex |
2 |
{
|
3 |
NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; |
4 |
|
5 |
if([title isEqualToString:@"Login"]) |
6 |
{
|
7 |
UITextField *username = [alertView textFieldAtIndex:0]; |
8 |
UITextField *password = [alertView textFieldAtIndex:1]; |
9 |
|
10 |
NSLog(@"Username: %@\nPassword: %@", username.text, password.text); |
11 |
}
|
12 |
}
|
Возможные ловушки
Есть несколько способов, при которых использование новых стилей Alert View могут иметь неприятные последствия.
Слишком много кнопок
Если Вы добавите не менее трех кнопок вUIAlertView
, компоновка каждого нового стиля станет искаженной.

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

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

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