Как бы я создал UIAlertView в Swift?

481

Я работал над созданием UIAlertView в Swift, но по какой-то причине я не могу правильно понять утверждение, потому что я получаю эту ошибку:

Не удалось найти перегрузку для 'init', который принимает предоставленные аргументы

Вот как я это написал:

let button2Alert: UIAlertView = UIAlertView(title: "Title", message: "message",
                     delegate: self, cancelButtonTitle: "OK", otherButtonTitles: nil)

Затем для вызова я использую:

button2Alert.show()

На данный момент это сбой, и я просто не могу понять синтаксис правильно.

BlueBear
источник
5
UIAlertViewи UIActionSheetбыл заменен UIAlertControllerв iOS 8, вы смотрели на это?
Popeye
Убедитесь, что класс, который selfпринадлежит, принимает протокол UIAlertViewDelegate(рекомендуемый способ сделать это в Swift - с расширением).
Николас Миари
@ Адам: я вернул твой тэг. Swift3 тег для «вопросов , непосредственно связанных с изменениями в 3 -й версии языка программирования Swift Apple.» И я не думаю, что «если ответы ясно показывают, что проблема в вопросе была вызвана чем-то иным, чем думал аскер, то повторная маркировка очень полезна». из meta.stackoverflow.com/questions/252079/… применяется здесь.
Мартин Р
1
@MartinR Я не знаю, как можно обновить вопросы, чтобы показать, что есть ответы, которые относятся к текущей версии Swift; здесь много старых, бесполезных вещей, и [swift] находит все это вместе с полезным. Я не чувствую особой уверенности в том, что этот ретаг будет отменен, но я хотел бы найти определенный способ решения этой проблемы. (Я бы хотел, чтобы в ответах были теги.)
Адам Эбербах

Ответы:

897

Из UIAlertViewкласса:

// UIAlertView устарела. Вместо этого используйте UIAlertController с предпочитаемым стилем UIAlertControllerStyleAlert

На iOS 8 вы можете сделать это:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)

Теперь UIAlertControllerэто единственный класс для создания и взаимодействия с тем, что мы знали как UIAlertViewс и UIActionSheetс на iOS 8.

Изменить: для обработки действий:

alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { action in
    switch action.style{
    case .Default:
        print("default")

    case .Cancel:
        print("cancel")

    case .Destructive:
        print("destructive")
    }
}}))

Редактировать для Swift 3:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)

Редактировать для Swift 4.x:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
      switch action.style{
      case .default:
            print("default")

      case .cancel:
            print("cancel")

      case .destructive:
            print("destructive")


}}))
self.present(alert, animated: true, completion: nil)
Оскар Сванрос
источник
3
Где вы видели, что UIAlertView устарела? Я не вижу этого в документации?
BlueBear
9
Cmd + Щелкните по UIAlertViewклассу, и комментарий находится прямо над объявлением класса.
Оскар Сванрос
2
Я отвечу на свой вопрос всем, кому любопытно alert.addAction (UIAlertAction (title: "Cancel", style: UIAlertActionStyle.Cancel, handler: {(ACTION: UIAlertAction!) In}))
altyus
5
Какой смысл в случаях отмены и деструктивного действия, поскольку это всегда будет то, что вы указали .Default?
Пользователь
4
Прочитав этот ответ, случай переключения, который вы сделали, не нужен . Переключение полезно только в том случае, если тип или заголовок не жестко закодированы, т.е. они динамические: у вас может быть ряд динамических кнопок, чтобы заголовки не были жестко закодированы. И тогда обработчику может понадобиться передать выбранный заголовок другому вызову метода
Honey
465

Одна кнопка

Скриншот одной кнопки

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertController.Style.alert)

        // add an action (button)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

Две кнопки

Снимок экрана с двумя кнопками

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "UIAlertController", message: "Would you like to continue learning how to use iOS alerts?", preferredStyle: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Continue", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

Три кнопки

введите описание изображения здесь

class ViewController: UIViewController {

    @IBAction func showAlertButtonTapped(_ sender: UIButton) {

        // create the alert
        let alert = UIAlertController(title: "Notice", message: "Lauching this missile will destroy the entire universe. Is this what you intended to do?", preferredStyle: UIAlertController.Style.alert)

        // add the actions (buttons)
        alert.addAction(UIAlertAction(title: "Remind Me Tomorrow", style: UIAlertAction.Style.default, handler: nil))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: nil))

        // show the alert
        self.present(alert, animated: true, completion: nil)
    }
}

Обработка нажатий кнопок

Это handlerбыло nilв приведенных выше примерах. Вы можете заменить nilс закрытием , чтобы сделать что - то , когда пользователь нажимает кнопку. Например:

alert.addAction(UIAlertAction(title: "Launch the Missile", style: UIAlertAction.Style.destructive, handler: { action in

    // do something like...
    self.launchMissile()

}))

Ноты

  • Несколько кнопок не обязательно должны использовать разные UIAlertAction.Styleтипы. Они все могут быть .default.
  • Для более чем трех кнопок рассмотрите использование листа действий. Настройка очень похожа. Вот пример.
Suragch
источник
2
есть ли свойство делегата в UIAlertController? в UIAlertView есть свойство делегата, которое мы иногда устанавливаем для себя, нет ли ничего подобного в UIAlertController ?? Я
новичок
Прекрасный ответ - Теперь, как мы можем перейти к новому представлению в обработчике?
That1Guy
114

Вы можете создать UIAlert, используя стандартный конструктор, но «устаревший», похоже, не работает:

let alert = UIAlertView()
alert.title = "Alert"
alert.message = "Here's a message"
alert.addButtonWithTitle("Understood")
alert.show()
Бен Готлиб
источник
8
UIAlertView устарела. Вместо этого используйте UIAlertController с предпочитаемым стилем UIAlertControllerStyleAlert.
Зорайр
16
@Zorayr UIAlertController доступен только с iOS 8 и более поздних версий, также укажите это при предложении его использования. Есть ситуации, когда поддержка iOS7 все еще желательна, и люди могут пропустить проблему. Устаревание не означает «никогда больше не используйте это».
Сами Кухмонен
2
Это работает, если ваше приложение все еще нацелено на iOS 7. Однако в идеале UIAlertView следует использовать только тогда, когда UIAlertController недоступен. if NSClassFromString ("UIAlertController")! = nil {/ * использовать UIAlertController * /} else {/ * использовать UIAlertView * /}
phatblat
UIAlertview () устарела в iOS 9
Ризван Ахмед
31

В Swift 4.2 и Xcode 10

Способ 1:

ПРОСТОЕ ПРЕДУПРЕЖДЕНИЕ

let alert = UIAlertController(title: "Your title", message: "Your message", preferredStyle: .alert)

     let ok = UIAlertAction(title: "OK", style: .default, handler: { action in
     })
     alert.addAction(ok)
     let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in
     })
     alert.addAction(cancel)
     DispatchQueue.main.async(execute: {
        self.present(alert, animated: true)
})

Способ 2:

ALERT с общим классом

Если вы хотите стиль общего класса (пишите один раз, используйте каждый раз)

import UIKit
class SharedClass: NSObject {//This is shared class
static let sharedInstance = SharedClass()

    //Show alert
    func alert(view: UIViewController, title: String, message: String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        alert.addAction(defaultAction)
        DispatchQueue.main.async(execute: {
            view.present(alert, animated: true)
        })
    }

    private override init() {
    }
}

Теперь вызывайте оповещения вот так в каждой посуде

SharedClass.SharedInstance.alert(view: self, title: "Your title here", message: "Your message here")

Способ 3:

НАСТОЯЩИЙ АЛЕРТ ВЕРХ ВСЕХ ОКОН

Если вы хотите создать оповещение поверх всех просмотров, используйте этот код

func alertWindow(title: String, message: String) {
    DispatchQueue.main.async(execute: {
        let alertWindow = UIWindow(frame: UIScreen.main.bounds)
        alertWindow.rootViewController = UIViewController()
        alertWindow.windowLevel = UIWindowLevelAlert + 1

        let alert2 = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction2 = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        alert2.addAction(defaultAction2)

        alertWindow.makeKeyAndVisible()

        alertWindow.rootViewController?.present(alert2, animated: true, completion: nil)
    })
}

Вызов функции

SharedClass.sharedInstance.alertWindow(title:"This your title", message:"This is your message")

Способ 4:

Оповещение с расширением

extension  UIViewController {

    func showAlert(withTitle title: String, withMessage message:String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let ok = UIAlertAction(title: "OK", style: .default, handler: { action in
        })
        let cancel = UIAlertAction(title: "Cancel", style: .default, handler: { action in
        })
        alert.addAction(ok)
        alert.addAction(cancel)
        DispatchQueue.main.async(execute: {
            self.present(alert, animated: true)
        })
    }
}

Теперь звоните вот так

//Call showAlert function in your class
@IBAction func onClickAlert(_ sender: UIButton) {
    showAlert(withTitle:"Your Title Here", withMessage: "YourCustomMessageHere")
}

Способ 5:

ALERT с текстовыми полями

Если вы хотите добавить текстовые поля для оповещения.

//Global variables
var name:String?
var login:String?

//Call this function like this:  alertWithTF() 
//Add textfields to alert 
func alertWithTF() {

    let alert = UIAlertController(title: "Login", message: "Enter username&password", preferredStyle: .alert)
    // Login button
    let loginAction = UIAlertAction(title: "Login", style: .default, handler: { (action) -> Void in
        // Get TextFields text
        let usernameTxt = alert.textFields![0]
        let passwordTxt = alert.textFields![1]
        //Asign textfileds text to our global varibles
        self.name = usernameTxt.text
        self.login = passwordTxt.text

        print("USERNAME: \(self.name!)\nPASSWORD: \(self.login!)")
    })

    // Cancel button
    let cancel = UIAlertAction(title: "Cancel", style: .destructive, handler: { (action) -> Void in })

    //1 textField for username
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter username"
        //If required mention keyboard type, delegates, text sixe and font etc...
        //EX:
        textField.keyboardType = .default
    }

    //2nd textField for password
    alert.addTextField { (textField: UITextField) in
        textField.placeholder = "Enter password"
        textField.isSecureTextEntry = true
    }

    // Add actions
    alert.addAction(loginAction)
    alert.addAction(cancel)
    self.present(alert, animated: true, completion: nil)

}

Способ 6:

Оповещение в SharedClass с расширением

//This is your shared class
import UIKit

 class SharedClass: NSObject {

 static let sharedInstance = SharedClass()

 //Here write your code....

 private override init() {
 }
}

//Alert function in shared class
extension UIViewController {
    func showAlert(title: String, msg: String) {
        DispatchQueue.main.async {
            let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }
}

Теперь звоните прямо так

self.showAlert(title: "Your title here...", msg: "Your message here...")

Способ 7:

Оповещение без общего класса с расширением в отдельном классе для предупреждения.

Создайте один новый класс Swift и import UIKit. Скопируйте и вставьте код ниже.

//This is your Swift new class file
import UIKit
import Foundation

extension UIAlertController {
    class func alert(title:String, msg:String, target: UIViewController) {
        let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default) {
        (result: UIAlertAction) -> Void in
        })
        target.present(alert, animated: true, completion: nil)
    }
}

Теперь вызывайте функцию оповещения таким образом во всех ваших классах (одна строка).

UIAlertController.alert(title:"Title", msg:"Message", target: self)

Как это....

IOS
источник
Perfekt! +1 Не могли бы вы добавить метод со встроенным таймаутом? Спасибо!
Паскаль
@ Прошу прощения, извините, я не могу понять, пожалуйста, объясните кратко.
iOS
Мне нужен alertController, который отображается до тех пор, пока не будет нажата кнопка «ОК» или не истечет время ожидания. Что-то вроде метода 6 или 7, но с дополнительной входной переменной timeout.
Паскаль
расширение UIViewController {func alertWithTime (title: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (title: title, message: msg, предпочитаемый стиль: .alert) alert.addAction (UIAlertAction : "ОК", стиль: .default, обработчик: ноль)) self.present (предупреждение, анимация: истина, завершение: ноль), если #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, повторения: false) , block: {_ в alert.dismiss (animated: true, завершение: nil)})} else {// Откат на более ранних версиях}}}}
iOS
1
Если вы упомянули timeInterval 0 в этом случае, если вы не хотите закрывать оповещение, используйте условие if. if timeInterval != 0 { if #available(iOS 10.0, *) { Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { _ in alert.dismiss(animated: true, completion: nil) }) } else { // Fallback on earlier versions } }
iOS
19

Щелчок Представления

@IBAction func testClick(sender: UIButton) {

  var uiAlert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
  self.presentViewController(uiAlert, animated: true, completion: nil)

  uiAlert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { action in
   println("Click of default button")
  }))

  uiAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { action in
   println("Click of cancel button")
  }))

}

Готово с двумя кнопками ОК и Отмена

Хирен Патель
источник
12

Если вы ориентируетесь на iOS 7 и 8, вам нужно что-то подобное, чтобы убедиться, что вы используете правильный метод для каждой версии, потому что UIAlertViewустарел в iOS 8, но UIAlertControllerнедоступен в iOS 7:

func alert(title: String, message: String) {
    if let getModernAlert: AnyClass = NSClassFromString("UIAlertController") { // iOS 8
        let myAlert: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        myAlert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
        self.presentViewController(myAlert, animated: true, completion: nil)
    } else { // iOS 7
        let alert: UIAlertView = UIAlertView()
        alert.delegate = self

        alert.title = title
        alert.message = message
        alert.addButtonWithTitle("OK")

        alert.show()
    }
}
AstroCB
источник
Или вы можете сэкономить время и просто использовать, UIAlertViewпока не прекратите поддержку iOS 7. Apple не отклонит ваше приложение за это.
cprcrack
2
Устаревание не означает «не используйте это» или то, что это будет «неправильный метод», это просто означает, что оно не будет работать позже. Нет необходимости специально использовать UIAlertController на iOS8, если нужны только базовые оповещения. Они будут работать как раньше. Есть много API, которые устарели в iOS4 или 5 и до сих пор работают в iOS8. Но, конечно, приложения, ориентированные на более высокий уровень iOS, не должны их использовать, и поэтому есть предупреждение об устаревании.
Сами Кухмонен
1
@SamiKuhmonen Нет, но это проясняет, почему вы делаете то, что вы делаете, и упрощает удаление поддержки устаревших методов, когда ваша минимальная версия достаточно высока, чтобы сделать это.
AstroCB
12

С помощью расширений протокола Swift 2 вы можете создать протокол, который обеспечивает реализацию по умолчанию для ваших контроллеров представления:

ShowsAlert.swift

import UIKit

protocol ShowsAlert {}

extension ShowsAlert where Self: UIViewController {
    func showAlert(title: String = "Error", message: String) {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil))
        presentViewController(alertController, animated: true, completion: nil)
    }
}

ViewController.swift

class ViewController: UIViewController, ShowsAlert {
    override func viewDidLoad() {
        super.viewDidLoad()
        showAlert(message: "Hey there, I am an error message!")
    }
}
knshn
источник
1
Работает отлично. Для Swift3 измените «presentViewController» на «присутствует».
Винсент
11

Показать UIAlertView на быстром языке: -

Протокол UIAlertViewDelegate

let alert = UIAlertView(title: "alertView", message: "This is alertView", delegate:self, cancelButtonTitle:"Cancel", otherButtonTitles: "Done", "Delete")
alert.show()

Показать UIAlertViewController на быстром языке: -

let alert = UIAlertController(title: "Error", message: "Enter data in Text fields", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
Анит Кумар
источник
11

Просто не предоставляйте другиеButtonTitles в конструкторе.

let alertView = UIAlertView(title: "Oops!", message: "Something
happened...", delegate: nil, cancelButtonTitle: "OK")

alertView.show()

Но я согласен с Оскаром, этот класс устарел в iOS 8, поэтому UIAlertView не будет использоваться, если вы работаете только с iOS 8. В противном случае приведенный выше код будет работать.

Peymankh
источник
9

Я нашел это,

var alertView = UIAlertView();
alertView.addButtonWithTitle("Ok");
alertView.title = "title";
alertView.message = "message";
alertView.show();

не очень хорошо, но это работает :)

Обновить:

но я нашел в заголовочном файле как:

extension UIAlertView {
    convenience init(title: String, message: String, delegate: UIAlertViewDelegate?, cancelButtonTitle: String?, otherButtonTitles firstButtonTitle: String, _ moreButtonTitles: String...)
}

кто-то может объяснить это.

Муджа Маски
источник
Очевидно, UIAlertView устарел в iOS 8, и теперь мы используем UIAlertController с предпочтительным стилем UIAlertControllerStyleAlert.
BlueBear
6
Если вы запускаете приложение, которое должно быть обратно совместимо с iOS7.1, и пишете его в Swift, UIAlertController приведет к сбою целевого устройства. Вам необходимо поддерживать устаревшие UIAlertViews для iOS7.
Джо
Я думаю, что не Swift вызовет сбой, а скорее тот факт, что UIAlertController недоступен до iOS 8
Frédéric Adda
7

Я думаю, что для SWIFT4 расширение UIViewControllerи создание многоразового элемента управления подтверждением является наиболее элегантным способом.

Вы можете расширить UIViewControllerкак ниже:

extension UIViewController {

func AskConfirmation (title:String, message:String, completion:@escaping (_ result:Bool) -> Void) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
    self.present(alert, animated: true, completion: nil)

    alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { action in
        completion(true)
    }))

    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
        completion(false)
    }))
  }
}

Тогда вы можете использовать его в любое время:

 AskConfirmation(title: "YOUR MESSAGE TITLE", message: "YOUR MESSAGE") { (result) in
        if result { //User has clicked on Ok

        } else { //User has clicked on Cancel

        }
    }
emreoktem
источник
5
    class Preview: UIViewController , UIAlertViewDelegate
    {
        @IBAction func MoreBtnClicked(sender: AnyObject)
        {
            var moreAlert=UIAlertView(title: "Photo", message: "", delegate: self, cancelButtonTitle: "No Thanks!", otherButtonTitles: "Save Image", "Email", "Facebook", "Whatsapp" )
            moreAlert.show()
            moreAlert.tag=111;
        }

        func alertView(alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int)
        {
            if alertView.tag==111
            {
                if buttonIndex==0
                {
                    println("No Thanks!")
                }
                else if buttonIndex==1
                {
                    println("Save Image")
                }
                else if buttonIndex == 2
                {
                    println("Email")
                }
                else if buttonIndex == 3
                {
                    println("Facebook")
                }
                else if buttonIndex == 4
                {
                    println("Whatsapp")
                }
            }
        }
    }
Джаеш Мирулия
источник
Просто писать кусок кода не очень полезно. При ответе на любой вопрос (особенно старый вопрос с несколькими ответами, включая принятый ответ), пожалуйста, напишите больше, чем кусок кода. Пожалуйста, добавьте объяснение того, что делает ваш код, как он отвечает на вопрос и чем он отличается (или лучше) от других ответов.
AdrianHHH
5

У меня есть еще один трюк. Предположим, у вас есть 5 классов, в которых должно быть применено предупреждение о выходе. Попробуйте с быстрым расширением класса.

Файл - Новый - Swift класс - Назовите его.

Добавьте следующее:

public extension UIViewController
{

    func makeLogOutAlert()
    {
        var refreshAlert = UIAlertController(title: "Log Out", message: "Are You Sure to Log Out ? ", preferredStyle: UIAlertControllerStyle.Alert)

        refreshAlert.addAction(UIAlertAction(title: "Confirm", style: .Default, handler: { (action: UIAlertAction!) in
            self.navigationController?.popToRootViewControllerAnimated(true)
        }))

        refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: { (action: UIAlertAction!) in
            refreshAlert .dismissViewControllerAnimated(true, completion: nil)
        }))

        presentViewController(refreshAlert, animated: true, completion: nil)
    }
}

Реализация с использованием: self.makeLogOutAlert (). Надеюсь, поможет.

AG
источник
5

Я создал одноэлементный класс, чтобы его было удобно использовать из любого места в вашем приложении: https://github.com/Swinny1989/Swift-Popups

Затем вы можете создать всплывающее окно с несколькими кнопками, например:

Popups.SharedInstance.ShowAlert(self, title: "Title goes here", message: "Messages goes here", buttons: ["button one" , "button two"]) { (buttonPressed) -> Void in
    if buttonPressed == "button one" { 
      //Code here
    } else if buttonPressed == "button two" {
        // Code here
    }
}

или всплывающее окно с одной кнопкой, как это:

Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.")
Swinny89
источник
Спасибо. Я отправляю туда какую-то проблему
djdance
1
Привет, @ Swinny89. Большое спасибо, что поделились этим решением с нами! Я застрял с закрытием, и ты только что спас меня!
Бруно Кампос
5

Свифт 3

Ниже приведен простой пример того, как создать простое оповещение с помощью одной кнопки с помощью Swift 3.

let alert = UIAlertController(title: "Title",
                              message: "Message",
                              preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default))
present(alert, animated: true)

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

Вот как можно создать другое действие, которое можно добавить к предупреждению с помощью «alert.addAction (action)». Различные стили: .default, .destructive и .cancel.

let action = UIAlertAction(title: "Ok", style: .default) { action in
    // Handle when button is clicked    
}

источник
4

Я получил следующий UIAlertViewкод инициализации для компиляции без ошибок (я думаю, что последняя, ​​varadic часть сложна, возможно). Но я должен был убедиться, что класс self(который я передаю как делегат) принимает UIAlertViewDelegateпротокол для устранения ошибок компиляции:

let alertView = UIAlertView(
                  title: "My Title",
                  message: "My Message",
                  delegate: self,
                  cancelButtonTitle: "Cancel",
                  otherButtonTitles: "OK"
                )

Кстати, это ошибка, которую я получаю (по состоянию на Xcode 6.4):

Не удается найти инициализатор для типа 'UIAlertView', который принимает список аргументов типа '(title: String, message: String, делегат: MyViewController, cancelButtonTitle: String, otherButtonTitles: String)'

Как уже упоминалось, вам следует перейти на UIAlertController, если вы можете использовать iOS 8.x +. Для поддержки iOS 7 используйте приведенный выше код (iOS 6 не поддерживается Swift).

Николас Миари
источник
4
 let alertController = UIAlertController(title: "Select Photo", message: "Select atleast one photo", preferredStyle: .alert)
    let action1 = UIAlertAction(title: "From Photo", style: .default) { (action) in
        print("Default is pressed.....")
    }
    let action2 = UIAlertAction(title: "Cancel", style: .cancel) { (action) in
        print("Cancel is pressed......")
    }
    let action3 = UIAlertAction(title: "Click new", style: .default) { (action) in
        print("Destructive is pressed....")

    }
    alertController.addAction(action1)
    alertController.addAction(action2)
    alertController.addAction(action3)
    self.present(alertController, animated: true, completion: nil)

}
Мистер Джавед Мултани
источник
4

Вы можете использовать это простое расширение с n количеством кнопок и связанных действий swift4 и выше

extension UIViewController {
    func popupAlert(title: String?, message: String?, actionTitles:[String?], actions:[((UIAlertAction) -> Void)?]) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for (index, title) in actionTitles.enumerated() {
            let action = UIAlertAction(title: title, style: .default, handler: actions[index])
            alert.addAction(action)
        }
        self.present(alert, animated: true, completion: nil)
    }
}

Вы можете использовать это как,

self.popupAlert(title: "Message", message: "your message", actionTitles: ["first","second","third"], actions:[
            {action1 in
                //action for first btn click
            },
            {action2 in
                //action for second btn click
            },
            {action3 in
                //action for third btn click
            }, nil]) 
мидхун р
источник
пожалуйста, не публикуйте повторяющиеся ответы. Если вы хотите отредактировать свой ответ.
iOS
Отличный ответ. Это то, что мне нужно. Спасибо!
Грегори Уилсон Пуллятту
3

Причина, по которой это не работает, потому что какое-то значение, которое вы передали функции, неверно. Swift не любит Objective-C, вы можете указывать nil для аргументов типа класса без каких-либо ограничений (может быть). Аргумент otherButtonTitles определяется как необязательный, тип которого не имеет (?) В конце. поэтому вы должны передать ей конкретное значение.

Оскар Ву
источник
3
@IBAction func Alert(sender: UIButton) {

    var alertView:UIAlertView = UIAlertView()
    alertView.title = "Alert!"
    alertView.message = "Message"
    alertView.delegate = self
    alertView.addButtonWithTitle("OK")

    alertView.show()

}

Попробуй это

gskril
источник
3

Используйте этот код для отображения предупреждений

  let alertController = UIAlertController(title: "Hello  Coders", message: "your alert message", preferredStyle: .Alert)
        let defaultAction = UIAlertAction(title: "Close Alert", style: .Default, handler: nil)
        alertController.addAction(defaultAction)

        presentViewController(alertController, animated: true, completion: nil)

Справка: быстрое оповещение с помощью UIAlertController

Шаба Аафрин
источник
3

в Xcode 9

let alert = UIAlertController(title: "Alert", message: "message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
luhuiya
источник
3

SWIFT 4: Просто создайте расширение для UIViewController следующим образом:

extension  UIViewController {        
    func showSuccessAlert(withTitle title: String, andMessage message:String) {
        let alert = UIAlertController(title: title, message: message,
                                  preferredStyle: UIAlertController.Style.alert)
        alert.addAction(UIAlertAction(title: "OK".localized, style:
        UIAlertAction.Style.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

Теперь в вашем ViewController напрямую вызовите вышеуказанную функцию, как если бы они были предоставлены UIViewController.

    yourViewController.showSuccessAlert(withTitle: 
      "YourTitle", andMessage: "YourCustomTitle")
Шиха Будхираджа
источник
Как правило, ответы гораздо полезнее, если они включают в себя объяснение того, для чего предназначен код, и почему это решает проблему, не представляя других. Спасибо за то, что улучшили ссылочную ценность ответа и сделали его более понятным!
Тим Дикманн
2

попробуй это. Поместите сильфон в кнопку.

let alert = UIAlertController(title: "Your_Title_Text", message: "Your_MSG", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Your_Text", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated:true, completion: nil)
Сагар Сангани
источник
1

Вот забавный пример в Swift:

private func presentRandomJoke() {
  if let randomJoke: String = jokesController.randomJoke() {
    let alertController: UIAlertController = UIAlertController(title:nil, message:randomJoke, preferredStyle: UIAlertControllerStyle.Alert)
    alertController.addAction(UIAlertAction(title:"Done", style:UIAlertActionStyle.Default, handler:nil))
    presentViewController(alertController, animated:true, completion:nil)
  }
}
Zorayr
источник
1

Вот довольно простая функция AlertView в Swift:

class func globalAlertYesNo(msg: String) {
        let alertView = UNAlertView(title: "Title", message: msg)

        alertView.messageAlignment = NSTextAlignment.Center
        alertView.buttonAlignment  = UNButtonAlignment.Horizontal

        alertView.addButton("Yes", action: {

            print("Yes action")

        })

        alertView.addButton("No", action: {

            print("No action")

        })

        alertView.show()

    }

Вы должны передать сообщение в виде строки, где вы используете эту функцию.

iAnkit
источник
1

Старый путь: UIAlertView

let alertView = UIAlertView(title: "Default Style", message: "A standard alert.", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK")
alertView.alertViewStyle = .Default
alertView.show()

// MARK: UIAlertViewDelegate

 func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) {
 switch buttonIndex {

    // ...
   }
  }

Новый путь: UIAlertController

let alertController = UIAlertController(title: "Default Style", message: "A standard alert.", preferredStyle: .Alert)

let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in
// ...
 }
 alertController.addAction(cancelAction)

 let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
// ...
 }
 alertController.addAction(OKAction)
 self.presentViewController(alertController, animated: true) {
 // ...
}
Shanmugasundharam
источник
1

на IOS 9 вы можете сделать это

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
Кешав Гера
источник
1

// Общий класс для UIAlertView

//MARK:- MODULES
import Foundation
import UIKit

//MARK:- CLASS
class Alert  : NSObject{

static let shared = Alert()

var okAction : AlertSuccess?
typealias AlertSuccess = (()->())?
var alert: UIAlertController?

/** show */
public func show(title : String?, message : String?, viewController : UIViewController?, okAction : AlertSuccess = nil) {

    let version : NSString = UIDevice.current.systemVersion as NSString
    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: title, message: message, preferredStyle:.alert)
        alert?.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action: UIAlertAction) in

            if let okAction = okAction {
                okAction()
            }
        }))
        viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil);
    }
}

/** showWithCancelAndOk */
public func showWithCancelAndOk(title : String, okTitle : String, cancelTitle : String, message : String, viewController : UIViewController?, okAction : AlertSuccess = nil, cancelAction : AlertSuccess = nil) {
    let version:NSString = UIDevice.current.systemVersion as NSString;

    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: title, message: message, preferredStyle:.alert)

        alert?.addAction(UIAlertAction(title: cancelTitle, style: .default, handler: { (action: UIAlertAction) in

            if let cancelAction = cancelAction {
                cancelAction()
            }
        }))
        alert?.addAction(UIAlertAction(title: okTitle, style: .default, handler: { (action: UIAlertAction) in

            if let okAction = okAction {
                okAction()
            }
        }))
        viewController?.present(alert!, animated:true, completion:nil);
    }
}

/** showWithTimer */
public func showWithTimer(message : String?, viewController : UIViewController?) {

    let version : NSString = UIDevice.current.systemVersion as NSString
    if  version.doubleValue >= 8 {
        alert = UIAlertController(title: "", message: message, preferredStyle:.alert)
        viewController?.present(alert ?? UIAlertController(), animated:true, completion:nil)
        let when = DispatchTime.now() + 1
        DispatchQueue.main.asyncAfter(deadline: when){
            self.alert?.dismiss(animated: true, completion: nil)
        }
    }
}
}

Использование: -

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self) //without ok action

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: {
                            //ok action
                        }) // with ok action

Alert.shared.show(title: "No Internet Connection", message: "The internet connection appers to be offline.", viewController: self, okAction: {
                            //ok action 
}, cancelAction: {
 //cancel action
}) //with cancel and ok action

Alert.shared.showWithTimer(message : "This is an alert with timer", viewController : self) //with timer
Пратюш Пратик
источник
1
  // UIAlertView is deprecated. Use UIAlertController 
  // title = title of the alert view.
  // message = Alert message you want to show.
  // By tap on "OK" , Alert view will dismiss.

 UIAlertView(title: "Alert", message: "Enter Message here.", delegate: nil, cancelButtonTitle: "OK").show()
Хитеш Чаухан
источник
Можете ли вы добавить объяснение к коду вы разместили? Как и сейчас, ваш ответ на самом деле не считается хорошим ответом по правилам SO.
Нико Ван Белл
представление предупреждений теперь изменилось в быстром контроллере предупреждений 4.use
Sandeep Singh