Статьи

Основы iOS: UIAlertView и UIAlertController

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

Тем не менее, Apple отказалась от UIAlertView в iOS 8. Начиная с iOS 8, рекомендуется использовать класс UIAlertController для представления листов действий и модальных предупреждений. В этом кратком совете я покажу вам, как легко перейти от UIAlertView к UIAlertController .

Запустите Xcode 6.3+ и создайте новый проект на основе шаблона приложения Single View .

Выберите шаблон приложения с одним представлением

Назовите оповещения проекта, установите « Язык» на Swift и « Устройства» на iPhone . Сообщите Xcode, где вы хотите сохранить файлы проекта, и нажмите « Создать» .

Настройте проект

Давайте начнем с добавления кнопки для запуска просмотра предупреждений. Откройте Main.storyboard и добавьте кнопку в представление контроллера представления. Установите заголовок кнопки на « Показать оповещение» и добавьте к ней необходимые ограничения, чтобы она оставалась на месте.

Создать простой пользовательский интерфейс

Откройте ViewController.swift и добавьте действие в реализацию класса. Оставьте реализацию действия пока пустой. Пересмотрите Main.storyboard и соедините действие showAlert контроллера представления с событием Touch Up Inside .

1
2
3
@IBAction func showAlert(sender: AnyObject) {
     
}

Начнем с показа предупреждений с использованием класса UIAlertView . Как я уже говорил, интерфейс класса UIAlertView очень прост. Операционная система заботится о мельчайших деталях. Вот как выглядит обновленная реализация действия showAlert .

01
02
03
04
05
06
07
08
09
10
@IBAction func showAlert(sender: AnyObject) {
    // Initialize Alert View
    let alertView = UIAlertView(title: «Alert», message: «Are you okay?», delegate: self, cancelButtonTitle: «Yes», otherButtonTitles: «No»)
     
    // Configure Alert View
    alertView.tag = 1
     
    // Show Alert View
    alertView.show()
}

Инициализация проста. Мы предоставляем заголовок и сообщение, передаем объект делегата, заголовок для кнопки отмены и заголовки для любых других кнопок, которые мы хотели бы включить.

Объект делегата должен соответствовать протоколу UIAlertViewDelegate . Поскольку контроллер представления будет действовать как делегат представления ViewController класс ViewController должен соответствовать протоколу UIAlertViewDelegate .

1
2
3
4
5
import UIKit
 
class ViewController: UIViewController, UIAlertViewDelegate {
    …
}

Методы протокола UIAlertViewDelegate определены как необязательные. Чаще всего вы будете использовать метод alertView(_:clickedButtonAtIndex:) . Этот метод вызывается, когда пользователь нажимает одну из кнопок представления предупреждений. Вот как может выглядеть реализация метода alertView(_:clickedButtonAtIndex:) .

1
2
3
4
5
6
7
8
9
func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) {
    if alertView.tag == 1 {
        if buttonIndex == 0 {
            println(«The user is okay.»)
        } else {
            println(«The user is not okay.»)
        }
    }
}

Создайте и запустите приложение в iOS Simulator, чтобы увидеть, все ли работает как положено.

Интерфейс UIAlertController сильно отличается от интерфейса UIAlertView , но мотивация Apple перейти на класс UIAlertController имеет смысл, если вы уже несколько раз использовали его. Это элегантный интерфейс, который будет казаться вам знакомым.

Первым преимуществом использования класса UIAlertController является отсутствие протокола делегата для обработки взаимодействия с пользователем. Это означает, что нам нужно только обновить реализацию действия showAlert . Посмотрите на обновленную реализацию ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
@IBAction func showAlert(sender: AnyObject) {
    // Initialize Alert Controller
    let alertController = UIAlertController(title: «Alert», message: «Are you okay?», preferredStyle: .Alert)
     
    // Initialize Actions
    let yesAction = UIAlertAction(title: «Yes», style: .Default) { (action) -> Void in
        println(«The user is okay.»)
    }
     
    let noAction = UIAlertAction(title: «No», style: .Default) { (action) -> Void in
        println(«The user is not okay.»)
    }
     
    // Add Actions
    alertController.addAction(yesAction)
    alertController.addAction(noAction)
     
    // Present Alert Controller
    self.presentViewController(alertController, animated: true, completion: nil)
}

Инициализация довольно проста. Мы передаем заголовок, сообщение и, самое главное, устанавливаем предпочтительный стиль UIAlertControllerStyle.Alert или .Alert для краткости. Предпочтительный стиль сообщает операционной системе, нужно ли представлять контроллер предупреждений в виде листа действий .ActionSheet или модального предупреждения .Alert .

Вместо предоставления заголовков для кнопок и обработки взаимодействия с пользователем через протокол UIAlertViewDelegate , мы добавляем действия в контроллер предупреждений. Каждое действие является экземпляром класса UIAlertAction . Создать UIAlertAction просто. Инициализатор принимает заголовок, стиль и обработчик. Аргумент стиля имеет тип UIAlertActionStyle . Обработчик является замыканием, принимающим объект UIAlertAction качестве единственного аргумента.

Использование обработчиков вместо протокола делегата делает реализацию модального оповещения более элегантной и более легкой для понимания. Больше нет необходимости маркировать представления предупреждений, если вы работаете с несколькими модальными предупреждениями.

Прежде чем мы представим контроллер оповещений пользователю, мы добавим два действия, вызвав addAction(_:) alertController объекта alertController . Обратите внимание, что порядок кнопок модального оповещения определяется порядком, в котором действия добавляются в контроллер оповещений.

Поскольку класс UIAlertController является подклассом UIViewController , представление контроллера предупреждений пользователю так же просто, как вызов presentViewController(_:animated:completion:) , передача контроллера предупреждений в качестве первого аргумента.

Неудивительно, что Apple также устарела в классе UIActionSheetDelegate протоколе UIActionSheetDelegate . Начиная с iOS 8, рекомендуется использовать класс UIAlertController для представления листа действий.

Представление листа действий идентично представлению модального предупреждения. Единственным отличием является свойство preferredStyle контроллера предупреждений, для которого необходимо задать значение UIAlertControllerStyle.ActionSheet или .ActionSheet коротко, для листов действий.

Хотя UIAlertView и UIActionSheet устарели в iOS 8, вы можете продолжать использовать их в обозримом будущем. Интерфейс класса UIAlertController , однако, является определенным улучшением. Это добавляет простоту и унифицирует API для представления модальных предупреждений и листов действий. А поскольку UIAlertController является подклассом UIViewController , API уже будет казаться вам знакомым.