Avatar ·

Как создать 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("Сообщение")
}

Этот подход идеально подходит для небольших проектов и прототипов, когда не нужно создавать отдельные функции для каждого алерта.