Як я можу створити UIAlertView в Swift?


481

Я працюю над створенням UIAlertView в Swift, але я чомусь не можу зрозуміти твердження, оскільки я отримую цю помилку:

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

Ось як я написав:

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

Тоді для його виклику я використовую:

button2Alert.show()

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


5
UIAlertViewі UIActionSheetйого замінили UIAlertControllerв iOS 8, ви це переглядали?
Popeye

Переконайтесь, що клас, який selfналежить прийняти протокол UIAlertViewDelegate(рекомендований спосіб зробити це у Swift, з розширенням).
Nicolas Miari

@Adam: Я відмінив ваше переназначення. Swift3 тег для «питань , безпосередньо пов'язаних зі змінами в 3 -й версії мови програмування Swift Apple.» І я не вважаю, що "Якщо у відповідях буде зрозуміло, що проблема в питанні була викликана чимось іншим, ніж те, що думав запитувач, переназначення дуже корисно". від meta.stackoverflow.com/questions/252079 / ... застосовується тут.
Мартін Р

1
@MartinR Я не знаю, як питання можна оновити, щоб показати, що є відповіді, які стосуються поточної версії 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є єдиний клас для створення та взаємодії з тим, що ми знали як UIAlertViews та UIActionSheets на 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 (назва: "Скасувати", стиль: UIAlertActionStyle.Cancel, обробник: {(ДІЯ: UIAlertAction!) В}))
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.
  • Більше трьох кнопок розглянемо використання аркуша дій. Установка дуже схожа. Ось приклад.

2
чи є якась властивість делегата в UIAlertController? в UIAlertView є властивість делегата, яку ми колись встановлювали для себе, чи немає нічого подібного в UIAlertController ?? Я новий, будь ласка, допоможіть мені
ArgaPK

Прекрасна відповідь - Тепер, як ми можемо перейти до нового погляду в межах обробника?
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 недоступний. якщо NSClassFromString ("UIAlertController")! = нуль {/ * використовувати UIAlertController * /} else {/ * використовувати UIAlertView * /}
phatblat

UIAlertview () тепер застаріло в iOS 9
Rizwan Ahmed

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:

ПОВЕРНЕННЯ З розділеним класом

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

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:

ПОПЕРЕДЖЕННЯ З ТЕКСТФІЛЬДАМИ

Якщо ви хочете додати текстові поля для попередження.

//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)

Як воно....


Perfekt! +1 Чи можете ви додати метод із інтегрованим тайм-аутом? Дякую!
PascalS

@ Пас, вибачте, я не можу зрозуміти, можу пояснити коротко.
iOS

Мені потрібне сповіщення контролера, яке відображається до натискання кнопки "ОК" або до настання тайм-ауту. Щось на зразок методу 6 або 7, але з додатковою вхідною змінною 'timeout'.
PascalS

розширення UIViewController {func alertWithTime (назва: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (назва: заголовок, повідомлення: msg, кращийStyle: .alert) alert.addAction (UIAlertAction (UIAlertAction) : "ОК", стиль: .default, обробник: nil)) self.present (попередження, анімовані: true, завершення: nil) якщо #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, повторює: false , блок: {_ in alert.dismiss (анімований: true, завершення: nil)})} else {// Відступ на попередніх версіях}}}}
iOS

1
Якщо ви згадуєте timeInterval 0 в цьому випадку, якщо ви не хочете закривати попередження, використовуйте, якщо це умова. 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")
  }))

}

Виконано двома кнопками OK та Скасувати


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()
    }
}

Або ви можете заощадити час і просто використовувати, 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!")
    }
}

1
Працює чудово. Для Swift3 змініть "presentViewController" на "present".
Вінсент

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. Інакше код, що працює вище, спрацює.


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

        }
    }

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 (). Сподіваюся, це допомагає.


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.")

Дякую. Я надсилаю там певну проблему
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код ініціалізації, який потрібно компілювати без помилок (я маю на увазі останню, варіадична частина, можливо, хитра). Але я повинен був переконатися, що клас self(який я передаю як делегат) приймає UIAlertViewDelegateпротокол, щоб помилки компіляції відходили:

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

До речі, це помилка, яку я отримував (станом на Xcode 6.4):

Неможливо знайти ініціалізатор для типу 'UIAlertView', який приймає список аргументів типу '(назва: String, повідомлення: 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, ви можете ставити нуль аргументам, які є класовим типом без будь-яких обмежень (можливо). Аргумент 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()

}

Спробуйте це


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)

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)
  }
}

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()

    }

Ви повинні передавати повідомлення як String, де ви використовуєте цю функцію.


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) {
 // ...
}

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()

Чи можете ви додати пояснення до опублікованого вами коду? Як і зараз, ваша відповідь справді не кваліфікується як хороша відповідь за правилами ТА.
Ніко Ван Белль

Перегляд тривожних сигналів змінився зараз у швидкому 4.використання контролера сповіщень
Sandeep Singh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.