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

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

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

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

1. Просте сповіщення

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

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

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

2. Сповіщення з полем для вводу тексту

Цей вид повідомлень використовується для виведення на екрані додаткового текстового поля, яке при певних завданнях може виконувати роль поля для вводу пароля (з одночасним приховуванням введеної інформації). Крім того, поєднуючи можливі варіанти застосування стандартного текстового поля, можна створювати форми авторизації з виведенням полів для вводу імені користувача та його пароля. Таким чином, можна зробити висновок, що ми отримали потужний інструмент для виведення необмеженої кількості текстових полів на формі повідомлення! При цьому використовуються стандартні засоби налаштування звичайного об'єкта UITextField.

Наприклад, створимо форму реєстрації користувача за допомогою нового класу UIAlertController:

- (IBAction)buttonTextInputAction:(UIButton *)sender {
    UIAlertController *alertController = [self createNewAlertView];
    
    [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = NSLocalizedString(@"LoginPlaceholder", @"Логін");
        
        [[NSNotificationCenter defaultCenter] addObserver:self
                                 selector:@selector(alertTextFieldDidChange:)
                                 name:UITextFieldTextDidChangeNotification
                                 object:textField];
     }];
    
    [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = NSLocalizedString(@"PasswordPlaceholder", @"Пароль");
        textField.secureTextEntry = YES;
        textField.enabled = NO;
        
        [[NSNotificationCenter defaultCenter] addObserver:self
                                 selector:@selector(alertTextFieldDidChange:)
                                 name:UITextFieldTextDidChangeNotification
                                 object:textField];
     }];
    
    UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", @"Скасувати")
                                 style:UIAlertActionStyleCancel
                                 handler:^(UIAlertAction *action) {
                                 NSLog(@"Скасувати дію");
    }];

    UIAlertAction *actionOk = [UIAlertAction actionWithTitle:NSLocalizedString(@"Ok", @"ОК")
                                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 текстових поля: Логін та Пароль. Для проведення реєстрації додаємо 2 кнопки, Скасувати та ОК, причому остання стане активною за умови заповнення користувачем усіх заданих полів. Для того, щоб вирішити цю задачу, ми застосовуємо 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.