Читать книгу iOS. Приемы программирования - Вандад Нахавандипур - Страница 19
Глава 1. Реализация контроллеров и видов
1.1. Отображение предупреждений с помощью UIAlertView
ОглавлениеПостановка задачи
Вы хотите, чтобы у ваших пользователей отобразилось сообщение, которое будет оформлено как предупреждение (Alert). Такие сообщения можно применять, чтобы попросить пользователя подтвердить выбранное действие, запросить у него имя и пароль или просто предложить ввести какой-нибудь простой текст, который вы сможете использовать в своем приложении.
Решение
Воспользуйтесь UIAlertView.
Обсуждение
Если вы сами пользуетесь iOS, то вам определенно попадались виды-предупреждения. Пример такого вида показан на рис. 1.1.
Рис. 1.1. Вид-предупреждение, сообщающий пользователю, что для работы требуется активное соединение с Интернетом
Наилучший способ инициализации вида-предупреждения заключается, разумеется, в использовании его базового конструктора-инициализатора:
– (void) viewDidAppear:(BOOL)paramAnimated{
[super viewDidAppear: paramAnimated];
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Alert"
message:@"You've been delivered an alert"
delegate: nil
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil];
[alertView show];
}
Когда этот вид-предупреждение отобразится у пользователя, он увидит экран, подобный показанному на рис. 1.2.
Рис. 1.2. Простой вид-предупреждение, отображаемый у пользователя
Чтобы показать пользователю вид-предупреждение, мы используем метод предупреждения show. Рассмотрим описания всех параметров, которые могут быть переданы базовому конструктору-инициализатору вида-предупреждения:
• title – строка, которую пользователь увидит в верхней части вида-предупрежения. На рис. 1.2 эта строка – Title;
• message – сообщение, которое отображается у пользователя. На рис. 1.2 для этого сообщения задано значение Message;
• delegate – опциональный объект-делегат, который мы передаем виду-предупреждению. Затем этот объект будет получать уведомление при каждом изменении состояния предупреждения, например, когда пользователь нажмет на экранную кнопку, изображенную в этом виде. Объект, передаваемый данному параметру, должен соответствовать протоколу UIAlertViewDelegate;
• cancelButtonTitle – строка, которая будет присваиваться кнопке отмены (Cancel Button) в виде-предупреждении. Если в виде-предупреждении есть кнопка отмены, то такой вид обычно побуждает пользователя к действию. Если пользователь не хочет совершать предложенное действие, то он нажимает кнопку отмены. Причем на этой кнопке не обязательно должна быть строка-надпись Cancel (Отменить). Надпись для этой кнопки определяете вы сами, и этот параметр опциональный – можно сделать диалоговое окно и без кнопки Отмена;
• otherButtonTitles – надписи на других кнопках, тех, которые вы хотите отобразить в виде-предупреждении. Разделяйте такие надписи запятыми. Нужно убедиться, что в конце списка названий стоит значение nil, называемое сигнальной меткой. Этот параметр не является обязательным.
Можно создать предупреждение вообще без кнопок. Но такое окно пользователь никак не сможет убрать с экрана. Создавая такой вид, вы как программист должны позаботиться о том, чтобы он убирался автоматически, например, через 3 секунды после того, как появится. Вид-предупреждение без кнопок, который не убирается автоматически, – это настоящее бедствие, с точки зрения пользователя. Ваше приложение не только получит низкие оценки на App Store за то, что вид-предупреждение блокирует пользовательский интерфейс. Велика вероятность, что вашу программу вообще удалят с рынка.
Виды-предупреждения можно оформлять с применением различных стилей. В классе UIAlertView есть свойство alertViewStyle типа UIAlertViewStyle:
typedef NS_ENUM(NSInteger, UIAlertViewStyle) {
UIAlertViewStyleDefault = 0,
UIAlertViewStyleSecureTextInput,
UIAlertViewStylePlainTextInput,
UIAlertViewStyleLoginAndPasswordInput
};
Вот что делает каждый из этих стилей:
• UIAlertViewStyleDefault – стандартный стиль вида-предупреждения, подобное оформление мы видели на рис. 1.2;
• UIAlertViewStyleSecureTextInput – при таком стиле в виде-предупреждении будет содержаться защищенное текстовое поле, которое станет скрывать от зрителя символы, вводимые пользователем. Такой вариант предупреждения вам подойдет, например, если вы запрашиваете у пользователя его учетные данные для дистанционного банковского обслуживания;
• UIAlertViewStylePlainTextInput – при таком стиле у пользователя будет отображаться незащищенное текстовое поле. Этот стиль отлично подходит для случаев, когда вы просите пользователя ввести несекретную последовательность символов, например номер его телефона;
• UIAlertViewStyleLoginAndPasswordInput – при таком стиле в виде-предупреждении будет два текстовых поля: незащищенное – для имени пользователя и защищенное – для пароля.
Если вам необходимо получать уведомление, когда пользователь начинает работать с видом-предупреждением, укажите объект-делегат для вашего предупреждения. Этот делегат должен подчиняться протоколу UIAlertViewDelegate. Самый важный метод, определяемый в этом протоколе, – alertView: clickedButtonAtIndex:, который вызывается сразу же, как только пользователь нажимает на одну из кнопок в виде-предупреждении. Индекс нажатой кнопки передается вам через параметр clickedButtonAtIndex.
В качестве примера отобразим предупреждение пользователю и спросим, хочет ли он перейти на сайт в браузере Safari после того, как нажмет ссылку на этот сайт, присутствующую в нашем пользовательском интерфейсе. В предупреждении будут отображаться две кнопки: Yes (Да) и No (Нет). В делегате вида-предупреждения мы увидим, какая кнопка была нажата, и предпримем соответствующие действия.
Сначала реализуем два очень простых метода, которые возвращают надпись на той или иной из двух кнопок:
– (NSString *) yesButtonTitle{
return @"Yes";
}
– (NSString *) noButtonTitle{
return @"No";
}
Теперь нужно убедиться, что контроллер нашего вида подчиняется протоколу UIAlertViewDelegate:
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface ViewController () <UIAlertViewDelegate>
@end
@implementation ViewController
…
Следующий шаг – создать и отобразить для пользователя окно с предупреждением:
– (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear: animated];
self.view.backgroundColor = [UIColor whiteColor];
NSString *message = @"Are you sure you want to open this link in Safari?";
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Open Link"
message: message
delegate: self
cancelButtonTitle: [self noButtonTitle]
otherButtonTitles: [self yesButtonTitle], nil];
[alertView show];
}
Вид-предупреждение будет выглядеть примерно как на рис. 1.3.
Рис. 1.3. Вид-предупреждение с кнопками No (Нет) и Yes (Да)
Далее нужно узнать, какой вариант пользователь выбрал в нашем окне – No (Нет) или Yes (Да). Для этого потребуется реализовать метод alertView: clickedButtonAtIndex:, относящийся к делегату нашего вида-предупреждения:
– (void) alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex{
NSString *buttonTitle = [alertView buttonTitleAtIndex: buttonIndex];
if ([buttonTitle isEqualToString: [self yesButtonTitle]]){
NSLog(@"User pressed the Yes button.");
}
else if ([buttonTitle isEqualToString: [self noButtonTitle]]){
NSLog(@"User pressed the No button.");
}
}
Стоит учитывать, что в больших проектах, когда несколько специалистов разрабатывают один и тот же исходный код, обычно удобнее сравнивать надписи с кнопок из вида-предупреждения с соответствующими строками, а не проверять, какая кнопка была нажата, ориентируясь на индекс этой кнопки. Чтобы решение с индексом работало, программисту придется найти код, в котором был сконструирован вид с предупреждением, и уже в этом коде посмотреть, у какой кнопки какой индекс. В рассмотренном же нами решении любой разработчик, даже не знающий, как именно был создан вид с предупреждением, может понять, какой оператор if что именно делает.
Как видите, мы пользуемся методом buttonTitleAtIndex: класса UIAlertView. Мы передаем этому методу индекс кнопки, отсчитываемый с нуля (кнопка находится в нашем виде), и получаем строку, которая представляет собой надпись на этой кнопке – если такая надпись вообще имеется. С помощью этого метода можно определить, какую кнопку нажал пользователь. Индекс этой кнопки будет передан нам как параметр buttonIndex метода alertView: clickedButtonAtIndex:. Если вас интересует надпись на этой кнопке, то нужно будет использовать метод buttonTitleAtIndex: класса UIAlertView. Все готово!
Кроме того, вид-предупреждение можно использовать и для текстового ввода, например, запрашивая у пользователя номер кредитной карточки или адрес. Для этого, как было указано ранее, нужно использовать стиль оформления предупреждения UIAlertViewStylePlainTextInput:
– (void) viewDidAppear:(BOOL)animated{
[super viewDidAppear: animated];
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Credit Card Number"
message:@"Please enter your credit card number: "
delegate: self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil];
[alertView setAlertViewStyle: UIAlertViewStylePlainTextInput];
/* Отобразить для этого текстового поля числовую клавиатуру. */
UITextField *textField = [alertView textFieldAtIndex:0];
textField.keyboardType = UIKeyboardTypeNumberPad;
[alertView show];
}
Если сейчас запустить приложение в эмуляторе, то мы увидим такое изображение, как на рис. 1.4.
Рис. 1.4. Вид-предупреждение для ввода обычным текстом
В этом коде мы изменяем стиль оформления вида на UIAlertViewStylePlainTextInput, а также делаем еще кое-что. Мы получили ссылку на первое и единственное текстовое поле, которое, как мы знаем, будет присутствовать в виде-предупреждении. Ссылку на текстовое поле применили для того, чтобы изменить тип клавиатуры, связанной с текстовым полем. Подробнее о текстовых полях поговорим в разделе 1.19.
Кроме обычного текста мы можем попросить пользователя набрать и защищенный текст. Как правило, защищается такой текст, который является для пользователя конфиденциальным, например пароль (рис. 1.5). Рассмотрим пример:
– (void) viewDidAppear:(BOOL)animated{
[super viewDidAppear: animated];
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Password"
message:@"Please enter your password: "
delegate: self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil];
[alertView setAlertViewStyle: UIAlertViewStyleSecureTextInput];
[alertView show];
}
Рис. 1.5. Ввод защищенного текста в окно с предупреждением
Стиль UIAlertViewStyleSecureTextInput очень напоминает UIAlertViewStylePlainTextInput, за исключением того, что вместо символов текста мы подставляем какие-то нейтральные символы.
Следующий стиль довольно полезный. Он позволяет отобразить два текстовых поля: одно для имени пользователя, а другое – для пароля. Текст в первом поле открыт, а во втором – скрыт:
– (void) viewDidAppear:(BOOL)animated{
[super viewDidAppear: animated];
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Password"
message:@"Please enter your credentials: "
delegate: self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil];
[alertView setAlertViewStyle: UIAlertViewStyleLoginAndPasswordInput];
[alertView show];
}
В результате увидим такое изображение, как на рис. 1.6.
Рис. 1.6. Стиль, позволяющий вводить в вид-предупреждение имя пользователя и пароль
См. также
Раздел 1.19.