Записки Junior-а: UIAlertCollection in iOS 8

Записки Junior-а: UIAlertCollection in iOS 8

Всем привет. С выходом новой версии iOS 8 компания Apple анонсировала более 4 000 новых API. Сегодня я хочу поделиться опытом применения нового класса UIAlertController, который заменил собой сразу 2 старых объекта: UIAlertView и UIActionSheet.

Переключение между используемыми при разработке стилями сообщений осуществляется при создании экземпляра контроллера.

1. A Simple Alert

При создании простого сообщения отличия заключаются в отсутствии делегата, привычных стандартных кнопок и реакции на их нажатия. По новой концепции каждая кнопка представляет собой событие (класс UIAlertAction), которое имеет название (actionWithTitle:), один из 3-х возможных стилей (style: UIAlertActionStyleDefault, UIAlertActionStyleCancel, UIAlertActionStyleDestructive) и обработчик нажатия (блок handler).

Каждое событие в произвольном порядке добавляется к контроллеру, причем порядок добавления событий влияет на очередность их отображения.

Записки Junior-а: UIAlertCollection in iOS 8

2. Text Input Alert

Данного вида сообщения применяются для вывода на экране дополнительного текстового поля, которое при определенных задачах может выступать в качестве поля для ввода пароля (с одновременным сокрытием вводимой информации). Кроме того, сочетая возможные варианты применения стандартного текстового поля, можно создавать формы авторизации с выводом полей для ввода имени пользователя и его пароля. Таким образом, можно сделать вывод, что мы получили мощный инструмент для вывода неограниченного количества текстовых полей на форме сообщения! При этом используются стандартные средства настройки обычного объекта UITextField.

Например, создадим форму регистрации пользователя при помощи нового класса UIAlertController:

- (IBAction)buttonTextInputAction:(UIButton *)sender {
    UIAlertController *alertController = [self createNewAlertView];
    
    [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = NSLocalizedString(@"LoginPlaceholder", @"Login");
        
        [[NSNotificationCenter defaultCenter] addObserver:self
                                 selector:@selector(alertTextFieldDidChange:)
                                 name:UITextFieldTextDidChangeNotification
                                 object:textField];
     }];
    
    [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = NSLocalizedString(@"PasswordPlaceholder", @"Password");
        textField.secureTextEntry = YES;
        textField.enabled = NO;
        
        [[NSNotificationCenter defaultCenter] addObserver:self
                                 selector:@selector(alertTextFieldDidChange:)
                                 name:UITextFieldTextDidChangeNotification
                                 object:textField];
     }];
    
    UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", @"Cancel action")
                                 style:UIAlertActionStyleCancel
                                 handler:^(UIAlertAction *action) {
                                 NSLog(@"Cancel action");
    }];

    UIAlertAction *actionOk = [UIAlertAction actionWithTitle:NSLocalizedString(@"Ok", @"OK action")
                                style:UIAlertActionStyleDefault
                                handler:^(UIAlertAction *action) {
                                UITextField *login = alertController.textFields.firstObject;
                                UITextField *password = alertController.textFields.lastObject;
    }];
    
    actionOk.enabled = NO;
     
    [alertController addAction:actionCancel];
    [alertController addAction:actionOk];
    
    [self presentViewController:alertController animated:YES completion:nil];
}

Из приведенного кода видно, что сначала мы создаем контроллер, на котором размещаем 2 текстовых поля: Login и Password. Для проведения регистрации добавляем 2 кнопки, Cancel и Ok, причем последняя станет активной при условии заполнения пользователем всех заданных полей. Для того, чтобы решить эту задачу, мы применяем NSNotificationCenter, который сообщит нам о событии редактирования любого из текстовых полей. Обработка проводится в отдельном методе alertTextFieldDidChange:.

В последней строке созданный нами контроллер отображается на экране в модальном режиме.

Записки Junior-а: UIAlertCollection in iOS 8

3. Action Sheet

Данный вид сообщения используется в случаях, когда пользователю необходимо предоставить право выбора из набора возможных вариантов. Применяя новые подходы Apple к внедрению адаптивного дизайна в оформлении приложений, это сообщение на устройствах iPhone появляется в нижней части экрана. Для iPad реализовано представление popover. Чтобы приложение смогло разделять интерфейсы между возможными девайсами, не забудьте установить параметр таргета Devices в Universal.

Записки Junior-а: UIAlertCollection in iOS 8

Кнопки событий отображаются сверху вниз в порядке их добавления к контроллеру, а обработчик Cancel всегда будет отображаться внизу списка в виде стандартной кнопки iOS 7.

Записки Junior-а: UIAlertCollection in iOS 8

Как я указал выше, для iPad сообщение отображается в виде popover. Popover всегда привязан к объекту, который его вызвал на выполнение (т.н. «якорь» или anchor point). В своем примере я «обыграл» поведение popover с несколькими объектами разных классов: UIButton, UISwitch, UIStepper и UIBarButtonItem.

В заключение хочу сказать, что старые классы UIAlertView и UIActionSheet по-прежнему поддерживаются iOS 8.