Come creerei un UIAlertView in Swift?


481

Ho lavorato per creare un UIAlertView in Swift, ma per qualche motivo non riesco a ottenere la dichiarazione giusta perché sto ricevendo questo errore:

Impossibile trovare un sovraccarico per "init" che accetta gli argomenti forniti

Ecco come l'ho scritto:

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

Quindi per chiamarlo sto usando:

button2Alert.show()

A partire da ora sta andando in crash e non riesco proprio a ottenere la sintassi giusta.


5
UIAlertViewed UIActionSheetè stato sostituito da UIAlertControlleriOS 8, hai visto questo?
Popeye,

Assicurati che la classe che selfappartiene adotti il ​​protocollo UIAlertViewDelegate(il modo consigliato per farlo, in Swift, è con un'estensione).
Nicolas Miari,

@Adam: ho ripristinato il tuo ricodifica. Il tag swift3 è per "domande direttamente correlate alle modifiche nella versione 3 del linguaggio di programmazione Swift di Apple". E non penso che "Se le risposte chiariscono che il problema nella domanda è stato causato da qualcosa di diverso da quello che pensava il richiedente, la ricodifica è molto utile." da meta.stackoverflow.com/questions/252079/… si applica qui.
Martin R,

1
@MartinR Non so come si possano aggiornare le domande per mostrare che ci sono risposte che si applicano a una versione corrente di Swift; c'è un sacco di roba vecchia e inutile qui e [veloce] trova tutto insieme all'utile. Non mi sento fortemente in merito al ripristino di questa replica, ma vorrei che ci fosse un modo definitivo per risolvere questo problema. (Vorrei che le risposte avessero tag.)
Adam Eberbach,

Risposte:


897

Dalla UIAlertViewclasse:

// UIAlertView è obsoleto. Utilizzare invece UIAlertController con uno Style preferito di UIAlertControllerStyleAlert

Su iOS 8, puoi farlo:

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)

Ora UIAlertControllerè un'unica classe per la creazione e l'interazione con ciò che sapevamo come UIAlertViews e UIActionSheets su iOS 8.

Modifica: per gestire le azioni:

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

Modifica per 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)

Modifica per 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
Dove hai visto che UIAlertView è obsoleto? Non lo vedo nella documentazione?
BlueBear,

9
Cmd + Fai clic sulla UIAlertViewclasse e il commento è in cima alla dichiarazione della classe.
Oscar Swanros,

2
Risponderò alla mia domanda per chiunque sia curioso alert.addAction (UIAlertAction (titolo: "Annulla", stile: UIAlertActionStyle.Cancel, gestore: {(AZIONE: UIAlertAction!) In}))
altyus

5
Qual è il punto di annullamento e casi distruttivi poiché sarà sempre quello che hai specificato .Default?
Utente

4
La lettura di questa risposta non è necessaria . L'opzione è utile solo se il tipo o il titolo non sono hardcoded, ovvero sono dinamici: potresti avere una serie di pulsanti dinamici, quindi i titoli non sono hardcoded. E quindi il gestore potrebbe aver bisogno di passare il titolo scelto ad un'altra chiamata di metodo
Honey

465

Un pulsante

Schermata di un pulsante

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

Due pulsanti

Schermata di avviso a due pulsanti

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

Tre pulsanti

inserisci qui la descrizione dell'immagine

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

Gestione dei rubinetti dei pulsanti

L' handlerera nilnegli esempi precedenti. È possibile sostituire nilcon una chiusura per fare qualcosa quando l'utente tocca un pulsante. Per esempio:

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

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

}))

Appunti

  • I pulsanti multipli non devono necessariamente utilizzare UIAlertAction.Styletipi diversi . Potrebbero essere tutti .default.
  • Per più di tre pulsanti considerare l'utilizzo di un foglio di azione. L'installazione è molto simile. Ecco un esempio

2
c'è qualche proprietà delegata in UIAlertController? in UIAlertView c'è una proprietà delegata che un tempo abbiamo impostato su noi stessi, non c'è niente di simile in UIAlertController ?? Sono nuovo, per favore aiutatemi
ArgaPK

Bella risposta - Ora come possiamo passare a una nuova vista all'interno del gestore?
That1 Acquista il

114

Puoi creare un UIAlert usando il costruttore standard, ma quello 'legacy' sembra non funzionare:

let alert = UIAlertView()
alert.title = "Alert"
alert.message = "Here's a message"
alert.addButtonWithTitle("Understood")
alert.show()

8
UIAlertView è obsoleto. Utilizzare invece UIAlertController con uno Style preferito di UIAlertControllerStyleAlert.
Zorayr,

16
@Zorayr UIAlertController è disponibile solo da iOS 8 in poi, si prega di menzionarlo anche quando si suggerisce il suo utilizzo. Ci sono situazioni in cui il supporto iOS7 è ancora desiderato e le persone potrebbero non conoscere il problema. La deprecazione non significa "non usarlo più".
Sami Kuhmonen,

2
Funziona se la tua app è ancora indirizzata a iOS 7. Tuttavia, idealmente UIAlertView dovrebbe essere usato solo quando UIAlertController non è disponibile. se NSClassFromString ("UIAlertController")! = zero {/ * usa UIAlertController * /} else {/ * usa UIAlertView * /}
phatblat

UIAlertview () è ora deprecato in iOS 9
Rizwan Ahmed,

31

In Swift 4.2 e Xcode 10

Metodo 1:

AVVISO SEMPLICE

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

Metodo 2:

AVVISO CON CLASSE CONDIVISA

Se vuoi uno stile di classe condiviso (Scrivi una volta, usa ogni dove)

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

Ora chiama un avviso come questo in ogni articolo

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

Metodo 3:

AVVISO ATTUALE TOP DI TUTTE LE FINESTRE

Se si desidera presentare un avviso in cima a tutte le visualizzazioni, utilizzare questo codice

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

Chiamata di funzione

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

Metodo 4:

Avviso con estensione

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

Adesso chiama così

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

Metodo 5:

AVVISO CON TEXTFIELDS

Se si desidera aggiungere campi di testo per avvisare.

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

}

Metodo 6:

Avviso in SharedClass con estensione

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

Adesso chiama direttamente così

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

Metodo 7:

Avviso senza classe condivisa con estensione in classe separata per avviso.

Crea una nuova classe Swift e import UIKit. Copia e incolla sotto il codice.

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

Ora chiama la funzione di avviso in questo modo in tutte le classi (linea singola).

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

Com'è....


Perfekt! +1 Potresti aggiungere un metodo con un timeout integrato? Grazie!
PascalS,

@ Passe, mi spiace non riesco a capire, per favore può spiegare brevemente.
iOS

Ho bisogno di un controller di allarme che viene presentato fino a quando non viene fatto clic sul pulsante "OK" o si verifica un timeout. Qualcosa come il metodo 6 o 7 ma con una variabile di input aggiuntiva "timeout".
PascalS,

estensione UIViewController {func alertWithTime (titolo: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (title: title, message: msg, favoriteStyle: .alert) alert.addAction (UIAlertAction : "OK", stile: .default, gestore: zero)) self.present (avviso, animato: vero, completamento: zero) se #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, ripete: false , blocco: {_ in alert.dismiss (animato: vero, completamento: zero)})} else {// Fallback su versioni precedenti}}}}
iOS

1
Se si menziona timeInterval 0 in quel caso se non si desidera chiudere l'avviso, utilizzare if condition. 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

Fare clic su Visualizza

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

}

Fatto con due pulsanti OK e Annulla


12

Se scegli come target iOS 7 e 8, hai bisogno di qualcosa del genere per assicurarti di utilizzare il metodo giusto per ogni versione, perché UIAlertViewè deprecato in iOS 8, ma UIAlertControllernon è disponibile in 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()
    }
}

Oppure puoi risparmiare tempo e utilizzare UIAlertViewfino a quando non elimini il supporto per iOS 7. Apple non rifiuterà la tua app per questo.
cprcrack,

2
La deprecazione non significa "non usare questo" o che sarebbe il "metodo sbagliato", significa solo che non funzionerà in seguito. Non è necessario utilizzare UIAlertController in modo specifico su iOS8 se sono necessari solo avvisi di base. Funzioneranno come prima. Esistono molte API che sono state deprecate in iOS4 o 5 e funzionano ancora in iOS8. Ma ovviamente le app destinate a un livello iOS superiore non dovrebbero usarle ed è per questo che c'è un avviso di deprecazione.
Sami Kuhmonen,

1
@SamiKuhmonen No, ma rende più chiaro il motivo per cui stai facendo quello che stai facendo e semplifica la rimozione del supporto per i metodi obsoleti quando la tua versione minima è abbastanza alta per farlo.
AstroCB

12

Con le estensioni di protocollo di Swift 2, puoi creare un protocollo che fornisce un'implementazione predefinita ai controller della vista:

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
Funziona perfettamente. Per Swift3 cambia 'presentViewController' in 'present'.
Vincent,

11

Mostra UIAlertView in una lingua veloce: -

Protocollo UIAlertViewDelegate

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

Mostra UIAlertViewController in una lingua veloce: -

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

Semplicemente non fornire otherButtonTitles nel costruttore.

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

alertView.show()

Ma sono d'accordo con Oscar, questa classe è obsoleta in iOS 8, quindi UIAlertView non verrà utilizzato se stai eseguendo solo un'app per iOS 8. Altrimenti il ​​codice sopra funzionerà.


9

Ho trovato questo

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

non va bene, ma funziona :)

Aggiornare:

ma ho trovato sul file di intestazione come:

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

qualcuno può spiegarlo.


Apparentemente UIAlertView è stato deprecato in iOS 8 e ora usiamo UIAlertController con uno stile preferito di UIAlertControllerStyleAlert.
BlueBear,

6
Se esegui un'app che deve essere retrocompatibile con iOS7.1 e la stai scrivendo in Swift, UIAlertController arresta in modo anomalo il dispositivo di destinazione. Devi supportare UIAlertViews legacy per iOS7.
Joe,

Penso che non sia Swift a causare un arresto, ma piuttosto il fatto che UIAlertController non è disponibile prima di iOS 8
Frédéric Adda,

7

Per SWIFT4 , penso che l'estensione UIViewControllere la creazione di un controllo di conferma riutilizzabile sia il modo più elegante.

È possibile estendere UIViewControllercome di seguito:

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

Quindi puoi usarlo in qualsiasi momento:

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

Basta scrivere un grumo di codice non è molto utile. Quando si risponde a una domanda (specialmente una vecchia domanda con diverse risposte, inclusa una risposta accettata), scrivere più di un pezzo di codice. Aggiungi una spiegazione di ciò che fa il tuo codice, come risponde alla domanda e in che modo è diverso (o migliore) rispetto alle altre risposte.
AdrianHHH,

5

Ho un altro trucco. Supponiamo di avere 5 classi in cui applicare un avviso di disconnessione. Prova con l'estensione di classe rapida.

File- Nuovo- Classe Swift- Denominalo.

Aggiungi quanto segue:

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

Implementare utilizzando: self.makeLogOutAlert (). Spero che sia d'aiuto.


5

Ho creato una lezione singleton per renderlo comodo da usare ovunque nella tua app: https://github.com/Swinny1989/Swift-Popups

È quindi possibile creare un popup con più pulsanti come questo:

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

o popup con un solo pulsante come questo:

Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.")

Grazie. Vi
presento

1
Hey @ Swinny89 Grazie mille per aver condiviso questa soluzione con noi! Mi sono bloccato con la cosa di chiusura e mi hai appena salvato!
Bruno Campos,

5

Swift 3

Di seguito è riportato un semplice esempio di come creare un semplice avviso con un pulsante con Swift 3.

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

Nell'esempio precedente, il callback handle dell'azione è stato omesso perché il comportamento predefinito di una vista di avviso con un pulsante è quello di scomparire quando si fa clic sul pulsante.

Ecco come creare un'altra azione, che potrebbe essere aggiunta all'avviso con "alert.addAction (azione)". I diversi stili sono .default, .destructive e .cancel.

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

4

Ho ottenuto il seguente UIAlertViewcodice di inizializzazione da compilare senza errori (penso che l'ultima parte variabile sia forse complicata). Ma dovevo assicurarmi che la classe di self(che sto passando come delegato) stava adottando il UIAlertViewDelegateprotocollo per far sparire gli errori di compilazione:

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

A proposito, questo è l'errore che stavo ottenendo (a partire da Xcode 6.4):

Impossibile trovare un inizializzatore per il tipo 'UIAlertView' che accetta un elenco di argomenti di tipo '(titolo: stringa, messaggio: stringa, delegato: MyViewController, cancelButtonTitle: String, otherButtonTitles: String)'

Come altri hanno già detto, dovresti migrare su UIAlertController se puoi scegliere come target iOS 8.x +. Per supportare iOS 7, utilizzare il codice sopra (iOS 6 non è supportato da 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

Puoi utilizzare questa semplice estensione con n numero di pulsanti e azioni associate swift4 e successive

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

puoi usarlo come,

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

per favore non pubblicare risposte duplicate. Se vuoi modificare la tua risposta.
iOS

Risposta eccellente. Questo è quello di cui ho bisogno. Grazie!
Gregory Wilson Pullyattu il

3

Il motivo per cui non funziona perché un valore passato alla funzione non è corretto. A Swift non piace Objective-C, puoi mettere a zero argomenti di tipo di classe senza alcuna restrizione (potrebbe essere). L'argomento otherButtonTitles è definito come non opzionale che il suo tipo non ha (?) Alla fine. quindi devi passarci un valore concreto.


3
@IBAction func Alert(sender: UIButton) {

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

    alertView.show()

}

Prova questo


3

Utilizzare questo codice per visualizzare una vista di avviso

  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)

Riferimento: Swift Show Alert utilizzando UIAlertController


3

in 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: è sufficiente creare un'estensione per UIViewController come segue:

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

Ora nel ViewController, chiama direttamente la funzione sopra come se fosse fornita da UIViewController.

    yourViewController.showSuccessAlert(withTitle: 
      "YourTitle", andMessage: "YourCustomTitle")

In generale, le risposte sono molto più utili se includono una spiegazione di ciò che il codice è destinato a fare e perché risolve il problema senza introdurre altri. Grazie per migliorare il valore di riferimento della risposta e renderlo più comprensibile!
Tim Diekmann,

2

prova questo. Inserisci il codice Muggito nel pulsante.

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

Ecco un esempio divertente in 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

Ecco una funzione abbastanza semplice di AlertView in 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()

    }

Devi passare un messaggio come stringa in cui usi questa funzione.


1

The Old Way: 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 {

    // ...
   }
  }

Il nuovo modo: 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

su IOS 9, puoi farlo

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

// Classe generica per 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)
        }
    }
}
}

Uso:-

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

Potete per favore aggiungere una spiegazione al codice che avete pubblicato? Come è ora, la tua risposta non si qualifica davvero come una buona risposta dalle regole SO.
Nico Van Belle,

la visualizzazione degli avvisi ora è cambiata in swift 4.use alert controller
Sandeep Singh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.