Даже если вы только окунулись в мир разработки под iOS, вы почти наверняка знаете о UIAlertView
. Класс UIAlertView
имеет простой интерфейс и используется для представления модальных предупреждений.
Тем не менее, Apple отказалась от UIAlertView
в iOS 8. Начиная с iOS 8, рекомендуется использовать класс UIAlertController
для представления листов действий и модальных предупреждений. В этом кратком совете я покажу вам, как легко перейти от UIAlertView
к UIAlertController
.
1. Настройка проекта
Запустите 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) {
}
|
2. UIAlertView
Начнем с показа предупреждений с использованием класса 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, чтобы увидеть, все ли работает как положено.
3. UIAlertController
Интерфейс 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:)
, передача контроллера предупреждений в качестве первого аргумента.
4. UIActionSheet
Неудивительно, что Apple также устарела в классе UIActionSheetDelegate
протоколе UIActionSheetDelegate
. Начиная с iOS 8, рекомендуется использовать класс UIAlertController
для представления листа действий.
Представление листа действий идентично представлению модального предупреждения. Единственным отличием является свойство preferredStyle
контроллера предупреждений, для которого необходимо задать значение UIAlertControllerStyle.ActionSheet
или .ActionSheet
коротко, для листов действий.
Вывод
Хотя UIAlertView
и UIActionSheet
устарели в iOS 8, вы можете продолжать использовать их в обозримом будущем. Интерфейс класса UIAlertController
, однако, является определенным улучшением. Это добавляет простоту и унифицирует API для представления модальных предупреждений и листов действий. А поскольку UIAlertController
является подклассом UIViewController
, API уже будет казаться вам знакомым.