Как создать UIAlertView в Swift? (UIAlertController)
Всем привет! Я только начал изучать Swift и разработку под iOS. Мне нужно показать пользователю простое предупреждение с кнопкой "ОК". Я смотрел старые туториалы, и там везде используют UIAlertView. Но когда я пишу такой код в Xcode:
let alert = UIAlertView(title: "Привет", message: "Это сообщение", delegate: nil, cancelButtonTitle: "OK")
alert.show()
Xcode выдаёт ошибку: 'UIAlertView' is unavailable: UIAlertView is deprecated. Use UIAlertController with a preferredStyle of UIAlertControllerStyleAlert instead.
Я понимаю, что UIAlertView больше не используется, но не могу разобраться с UIAlertController. Как правильно создать такое же предупреждение? Нужно ли подключать делегат? Как обработать нажатие на кнопку? Пожалуйста, покажите простой рабочий пример для iOS 13+.
Заранее спасибо за помощь!
<<Создание UIAlertController в Swift (современный способ)
Действительно, UIAlertView был объявлен устаревшим ещё в iOS 8. Начиная с этой версии, Apple рекомендует использовать UIAlertController. Он работает как для простых предупреждений (alert), так и для Action Sheets. Давайте разберём правильный подход.
Базовая реализация (предупреждение с одной кнопкой)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
showSimpleAlert()
}
func showSimpleAlert() {
// 1. Создаём контроллер
let alertController = UIAlertController(
title: "Привет",
message: "Это сообщение для пользователя",
preferredStyle: .alert
)
// 2. Создаём действие (кнопку)
let okAction = UIAlertAction(
title: "OK",
style: .default,
handler: { action in
print("Пользователь нажал OK")
// Здесь можно выполнить нужные действия
}
)
// 3. Добавляем действие к контроллеру
alertController.addAction(okAction)
// 4. Показываем контроллер
present(alertController, animated: true, completion: nil)
}
}
Ключевые моменты
- preferredStyle — может быть
.alert(всплывающее окно) или.actionSheet(панель снизу). - UIAlertAction — каждая кнопка. Параметр
styleбывает:.default(обычная),.cancel(отмена, жирный шрифт),.destructive(опасное действие, красный цвет). - handler — замыкание, которое выполняется при нажатии. Если обработка не нужна, передайте
nil. - present — обязательный вызов для отображения. Вызывайте его внутри UIViewController.
Пример с несколькими кнопками и обработкой
func showAlertWithMultipleActions() {
let alert = UIAlertController(
title: "Подтверждение",
message: "Вы уверены, что хотите удалить этот элемент?",
preferredStyle: .alert
)
// Кнопка "Удалить" (опасное действие)
let deleteAction = UIAlertAction(
title: "Удалить",
style: .destructive,
handler: { _ in
// Логика удаления
print("Элемент удалён")
}
)
// Кнопка "Отмена"
let cancelAction = UIAlertAction(
title: "Отмена",
style: .cancel,
handler: nil
)
alert.addAction(deleteAction)
alert.addAction(cancelAction)
present(alert, animated: true)
}
Распространённые ошибки
- Забыли вызвать present() — алерт не появится.
- Неправильный preferredStyle — например, для .actionSheet на iPad нужно указывать источник (popover), иначе будет краш.
- Попытка показать алерт, когда контроллер уже скрыт — используйте проверку
view.window != nil.
Теперь вы знаете современный способ. UIAlertController гибче старого UIAlertView: он поддерживает текстовые поля (для ввода пароля), несколько кнопок с разными стилями и легко настраивается. Удачи в разработке!
Альтернативный подход: использование расширения (extension) для UIViewController
Если вам нужно часто показывать простые алерты, можно создать удобное расширение. Это сократит код и сделает его более читаемым.
extension UIViewController {
func showAlert(title: String, message: String, okHandler: (() -> Void)? = nil) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default) { _ in
okHandler?()
}
alert.addAction(okAction)
present(alert, animated: true)
}
}
Теперь в любом контроллере можно вызвать:
showAlert(title: "Ошибка", message: "Проверьте подключение к интернету") {
// Действие после нажатия OK
self.retryConnection()
}
Дополнительный совет
Для iOS 15+ можно использовать новую SwiftUI-структуру .alert(), но в UIKit UIAlertController остаётся стандартом. Если вы пишете на SwiftUI, вот пример:
.alert("Заголовок", isPresented: $showAlert) {
Button("OK") { /* действие */ }
} message: {
Text("Сообщение")
}
Этот подход идеально подходит для небольших проектов и прототипов, когда не нужно создавать отдельные функции для каждого алерта.
Ответов пока нет.
Войдите чтобы оставить ответ