Wie würde ich eine UIAlertView in Swift erstellen?


481

Ich habe daran gearbeitet, eine UIAlertView in Swift zu erstellen, aber aus irgendeinem Grund kann ich die Anweisung nicht richtig verstehen, weil ich diesen Fehler erhalte:

Es wurde keine Überladung für 'init' gefunden, die die angegebenen Argumente akzeptiert

So habe ich es geschrieben:

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

Um es dann zu nennen, benutze ich:

button2Alert.show()

Ab sofort stürzt es ab und ich kann die Syntax einfach nicht richtig verstehen.


5
UIAlertViewund UIActionSheetwurde durch UIAlertControllerin iOS 8 ersetzt, haben Sie sich das angesehen?
Popeye

Stellen Sie sicher, dass die Klasse, zu der selfgehört, das Protokoll übernimmt UIAlertViewDelegate(die empfohlene Vorgehensweise in Swift ist eine Erweiterung).
Nicolas Miari

@Adam: Ich habe dein Retagging rückgängig gemacht. Das swift3- Tag steht für "Fragen, die in direktem Zusammenhang mit Änderungen in Version 3 der Apple-Programmiersprache Swift stehen". Und ich denke nicht, dass "Wenn die Antworten deutlich machen, dass das Problem in der Frage durch etwas anderes als das verursacht wurde, was der Fragesteller dachte, ist das Retaggen sehr hilfreich." von meta.stackoverflow.com/questions/252079/… gilt hier.
Martin R

1
@MartinR Ich weiß nicht, wie Fragen aktualisiert werden können, um zu zeigen, dass es Antworten gibt, die für eine aktuelle Version von Swift gelten. Es gibt viele alte, nutzlose Sachen hier und [schnell] findet alles zusammen mit dem Nützlichen. Ich habe nicht das starke Gefühl, dass dieser Retag zurückgesetzt wird, aber ich wünschte, es gäbe einen endgültigen Weg, um dieses Problem zu lösen. (Ich wünschte, Antworten hätten Tags.)
Adam Eberbach

Antworten:


897

Aus der UIAlertViewKlasse:

// UIAlertView ist veraltet. Verwenden Sie stattdessen UIAlertController mit einem bevorzugten Stil von UIAlertControllerStyleAlert

Unter iOS 8 können Sie dies tun:

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)

Jetzt UIAlertControllergibt es eine einzige Klasse zum Erstellen und Interagieren mit dem, was wir unter iOS 8 als UIAlertViews und UIActionSheets kannten .

Bearbeiten: So handhaben Sie Aktionen:

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

Bearbeiten für 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)

Bearbeiten für 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
Wo haben Sie gesehen, dass UIAlertView veraltet ist? Ich sehe das nicht in der Dokumentation?
BlueBear

9
Befehlstaste + Klicken Sie auf die UIAlertViewKlasse, und der Kommentar befindet sich direkt über der Klassendeklaration.
Oscar Swanros

2
Ich werde meine eigene Frage für jemand anderen beantworten , die neugierig alert.addAction ist (UIAlertAction (Titel: "Abbrechen", style: UIAlertActionStyle.Cancel, Handler: {(ACTION: UIAlertAction) in}))
altyus

5
Was bringt es, Fälle abzubrechen und zu zerstören, da dies immer das ist, was Sie angegeben haben .Default?
Benutzer

4
Das Lesen dieser Antwort ist nicht erforderlich . Der Schalter ist nur nützlich, wenn der Typ oder Titel nicht fest codiert ist, dh dynamisch: Möglicherweise verfügen Sie über eine Reihe dynamischer Schaltflächen, sodass die Titel nicht fest codiert sind. Und dann muss der Handler möglicherweise den ausgewählten Titel an einen anderen Methodenaufruf weitergeben
Honey

465

Ein Knopf

Ein Button Screenshot

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

Zwei Knöpfe

Screenshot mit zwei Schaltflächen

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

Drei Knöpfe

Geben Sie hier die Bildbeschreibung ein

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

Handhabung von Tastenanschlägen

Das handlerwar nilin den obigen Beispielen. Sie können durch nileinen Verschluss ersetzen , um etwas zu tun, wenn der Benutzer auf eine Schaltfläche tippt. Zum Beispiel:

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

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

}))

Anmerkungen

  • Mehrere Schaltflächen müssen nicht unbedingt unterschiedliche UIAlertAction.StyleTypen verwenden. Sie könnten alle sein.default .
  • Bei mehr als drei Schaltflächen sollten Sie ein Aktionsblatt verwenden. Das Setup ist sehr ähnlich. Hier ist ein Beispiel.

2
Gibt es eine Delegate-Eigenschaft in UIAlertController? In UIAlertView gibt es eine Delegate-Eigenschaft, die wir manchmal auf self setzen. Gibt es in UIAlertController nichts Vergleichbares? Ich bin neu, bitte helfen Sie mir
ArgaPK

Schöne Antwort - Wie können wir nun innerhalb des Handlers zu einer neuen Ansicht wechseln?
That1Guy

114

Sie können einen UIAlert mit dem Standardkonstruktor erstellen, aber der "Legacy" -Konstruktor scheint nicht zu funktionieren:

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

8
UIAlertView ist veraltet. Verwenden Sie stattdessen UIAlertController mit einem bevorzugten Stil von UIAlertControllerStyleAlert.
Zorayr

16
@Zorayr UIAlertController ist nur ab iOS 8 verfügbar. Bitte erwähnen Sie dies auch, wenn Sie die Verwendung vorschlagen. Es gibt Situationen, in denen iOS7-Unterstützung weiterhin erwünscht ist und das Problem möglicherweise übersehen wird. Abwertung bedeutet nicht "benutze das nie mehr".
Sami Kuhmonen

2
Dies funktioniert, wenn Ihre App immer noch auf iOS 7 ausgerichtet ist. Idealerweise sollte UIAlertView jedoch nur verwendet werden, wenn UIAlertController nicht verfügbar ist. if NSClassFromString ("UIAlertController")! = nil {/ * benutze UIAlertController * /} else {/ * benutze UIAlertView * /}
phatblat

UIAlertview () ist jetzt in iOS 9
Rizwan Ahmed

31

In Swift 4.2 und Xcode 10

Methode 1 :

EINFACHER ALARM

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

Methode 2:

ALARM MIT GEMEINSAMER KLASSE

Wenn Sie einen gemeinsamen Klassenstil wünschen (einmal schreiben, überall verwenden)

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

Rufen Sie jetzt in jeder Ware einen solchen Alarm an

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

Methode 3:

PRÄSENTIEREN SIE ALARM OBEN ALLER FENSTER

Verwenden Sie diesen Code, wenn Sie über allen Ansichten eine Warnung anzeigen möchten

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

Funktionsaufruf

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

Methode 4:

Alarm mit Erweiterung

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

Rufen Sie jetzt so an

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

Methode 5:

ALARM MIT TEXTFELDERN

Wenn Sie Textfelder zur Warnung hinzufügen möchten.

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

}

Methode 6:

Warnung in SharedClass mit Erweiterung

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

Rufen Sie jetzt direkt so an

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

Methode 7:

Warnung ohne gemeinsame Klasse mit Erweiterung in separater Klasse zur Warnung.

Erstellen Sie eine neue Swift-Klasse und import UIKit. Kopieren Sie den folgenden Code und fügen Sie ihn ein.

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

Rufen Sie nun in all Ihren Klassen eine solche Warnfunktion auf (einzeilig).

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

Wie ist das....


Perfekt! +1 Könnten Sie bitte eine Methode mit integriertem Timeout hinzufügen? Vielen Dank!
PascalS

@ Passe, sorry ich kann nicht verstehen, kann bitte kurz erklären.
iOS

Ich benötige einen alertController, der angezeigt wird, bis auf die Schaltfläche "OK" geklickt wird oder eine Zeitüberschreitung auftritt. So etwas wie Methode 6 oder 7, aber mit einer zusätzlichen Eingabevariablen 'timeout'.
PascalS

Erweiterung UIViewController {func alertWithTime (Titel: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (Titel: Titel, Nachricht: msg, PreferredStyle: .alert) alert.addAction (UIAlertAction (Titel) : "OK", Stil: .default, Handler: nil)) self.present (Warnung, animiert: true, Vervollständigung: nil) falls #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, Wiederholungen: false , block: {_ in alert.dismiss (animiert: true, Vervollständigung: nil)})} else {// Fallback auf frühere Versionen}}}}
iOS

1
Wenn Sie in diesem Fall timeInterval 0 erwähnen, wenn Sie den Alarm nicht schließen möchten, verwenden Sie die if-Bedingung. 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

Klicken Sie auf Ansicht

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

}

Fertig mit zwei Tasten OK & Abbrechen


12

Wenn Sie auf iOS 7 und 8 abzielen , benötigen Sie Folgendes, um sicherzustellen, dass Sie für jede Version die richtige Methode verwenden, da diese UIAlertViewin iOS 8 veraltet, in iOS 7 jedoch UIAlertControllernicht verfügbar ist:

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

Oder Sie können Zeit sparen und nur verwenden, UIAlertViewbis Sie die Unterstützung für iOS 7 einstellen. Apple wird Ihre App dafür nicht ablehnen.
cprcrack

2
Verachtung bedeutet nicht "benutze dies nicht" oder dass es die "falsche Methode" wäre, es bedeutet nur, dass es später nicht funktionieren wird. Es ist nicht erforderlich, UIAlertController unter iOS8 speziell zu verwenden, wenn nur grundlegende Warnungen benötigt werden. Sie werden wie zuvor arbeiten. Es gibt viele APIs, die in iOS4 oder 5 veraltet sind und in iOS8 noch funktionieren. Aber natürlich sollten Apps, die auf ein höheres iOS-Level abzielen, diese nicht verwenden, und deshalb gibt es eine Warnung vor Ablehnung.
Sami Kuhmonen

1
@SamiKuhmonen Nein, aber es macht klarer, warum Sie das tun, was Sie tun, und erleichtert das Entfernen der Unterstützung für veraltete Methoden, wenn Ihre Mindestversion dafür hoch genug ist.
AstroCB

12

Mit den Protokollerweiterungen von Swift 2 können Sie ein Protokoll erstellen, das Ihren Ansichtscontrollern eine Standardimplementierung bietet:

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
Funktioniert perfekt. Ändern Sie für Swift3 'presentViewController' in 'present'.
Vincent

11

UIAlertView in schneller Sprache anzeigen: -

Protokoll UIAlertViewDelegate

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

UIAlertViewController in schneller Sprache anzeigen: -

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

Geben Sie im Konstruktor einfach keine otherButtonTitles an.

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

alertView.show()

Aber ich stimme Oscar zu, diese Klasse ist in iOS 8 veraltet, sodass UIAlertView nicht verwendet wird, wenn Sie nur eine iOS 8-App verwenden. Andernfalls funktioniert der obige Code.


9

Ich habe diesen gefunden,

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

nicht gut, aber es funktioniert :)

Aktualisieren:

aber ich habe in der Header-Datei gefunden als:

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

jemand kann das erklären.


Anscheinend ist UIAlertView in iOS 8 veraltet und wir verwenden jetzt UIAlertController mit einem bevorzugten Stil von UIAlertControllerStyleAlert.
BlueBear

6
Wenn Sie eine App ausführen, die abwärtskompatibel mit iOS7.1 sein muss, und Sie sie in Swift schreiben, stürzt der UIAlertController das Zielgerät ab. Sie müssen die älteren UIAlertViews für iOS7 unterstützen.
Joe

Ich denke, dass es nicht Swift ist, das einen Absturz verursachen würde, sondern die Tatsache, dass der UIAlertController nicht vor iOS 8 verfügbar ist
Frédéric Adda

7

Für SWIFT4 ist es meiner Meinung nach UIViewControlleram elegantesten, eine wiederverwendbare Bestätigungssteuerung zu erweitern und zu erstellen.

Sie können UIViewControllerFolgendes erweitern:

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

Dann können Sie es jederzeit verwenden:

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

Nur einen Codeklumpen zu schreiben, ist nicht sehr nützlich. Wenn Sie eine Frage beantworten (insbesondere eine alte Frage mit mehreren Antworten, einschließlich einer akzeptierten Antwort), schreiben Sie bitte mehr als einen Code. Bitte fügen Sie eine Erklärung hinzu, was Ihr Code tut, wie er die Frage beantwortet und wie er sich von den anderen Antworten unterscheidet (oder besser ist).
AdrianHHH

5

Ich habe noch einen Trick. Angenommen, Sie haben 5 Klassen, in denen eine Abmeldemeldung angewendet werden soll. Versuchen Sie es mit einer schnellen Klassenerweiterung.

Datei- Neu- Swift-Klasse- Nennen Sie es.

Fügen Sie Folgendes hinzu:

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

Implementieren Sie mit: self.makeLogOutAlert (). Ich hoffe es hilft.


5

Ich habe eine Singleton-Klasse erstellt, um die Verwendung von überall in Ihrer App zu vereinfachen : https://github.com/Swinny1989/Swift-Popups

Sie können dann ein Popup mit mehreren Schaltflächen wie folgt erstellen:

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

oder Popups mit einer einzigen Schaltfläche wie folgt:

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

Vielen Dank. Ich
reiche

1
Hey @ Swinny89 Vielen Dank, Mann, dass du diese Lösung mit uns geteilt hast! Ich bin mit der Verschlusssache festgefahren und du hast mich gerade gerettet!
Bruno Campos

5

Swift 3

Das folgende Beispiel zeigt, wie Sie mit Swift 3 eine einfache Warnung mit einer Schaltfläche erstellen.

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

Im obigen Beispiel wurde der Handle-Rückruf der Aktion weggelassen, da das Standardverhalten einer Warnansicht mit einer Schaltfläche beim Klicken auf die Schaltfläche ausgeblendet wird.

Hier erfahren Sie, wie Sie eine weitere Aktion erstellen, die mit "alert.addAction (action)" zur Warnung hinzugefügt werden kann. Die verschiedenen Stile sind .default, .destructive und .cancel.

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

4

Ich habe den folgenden UIAlertViewInitialisierungscode zum fehlerfreien Kompilieren erhalten (ich denke, der letzte, abwechslungsreiche Teil ist vielleicht schwierig). Aber ich musste sicherstellen, dass die Klasse von self(die ich als Delegierter übergebe) das UIAlertViewDelegateProtokoll übernahm, damit die Kompilierungsfehler verschwinden:

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

Dies ist übrigens der Fehler, den ich erhalten habe (ab Xcode 6.4):

Es kann kein Initialisierer für den Typ 'UIAlertView' gefunden werden, der eine Argumentliste vom Typ 'akzeptiert (Titel: String, Nachricht: String, Delegat: MyViewController, cancelButtonTitle: String, otherButtonTitles: String)'

Wie bereits erwähnt, sollten Sie auf UIAlertController migrieren, wenn Sie auf iOS 8.x + abzielen können. Verwenden Sie zur Unterstützung von iOS 7 den obigen Code (iOS 6 wird von Swift nicht unterstützt).


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

Sie können diese einfache Erweiterung mit n Anzahl von Schaltflächen und zugehörigen Aktionen ab Swift4 verwenden

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

Sie können es wie verwenden,

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

Sie posten bitte keine doppelten Antworten. Wenn Sie Ihre Antwort bearbeiten möchten.
iOS

Hervorragende Antwort. Das ist das, was ich benötige. Vielen Dank!
Gregory Wilson Pullyattu

3

Der Grund, warum es nicht funktioniert, weil ein Wert, den Sie an die Funktion übergeben haben, nicht korrekt ist. swift mag Objective-C nicht, Sie können Argumente, die vom Klassentyp sind, ohne Einschränkung mit Null versehen (möglicherweise). Das Argument otherButtonTitles ist als nicht optional definiert, dessen Typ kein (?) Am Ende hat. Sie müssen ihm also einen konkreten Wert übergeben.


3
@IBAction func Alert(sender: UIButton) {

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

    alertView.show()

}

Versuche dies


3

Verwenden Sie diesen Code, um eine Alarmansicht anzuzeigen

  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)

Referenz: Swift Show Alert mit 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: Erstellen Sie einfach eine Erweiterung für UIViewController wie folgt:

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

Rufen Sie jetzt in Ihrem ViewController die obige Funktion direkt auf, als ob sie von UIViewController bereitgestellt würden.

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

Im Allgemeinen sind Antworten viel hilfreicher, wenn sie eine Erklärung enthalten, was der Code tun soll und warum dies das Problem löst, ohne andere einzuführen. Vielen Dank, dass Sie den Referenzwert der Antwort verbessert und verständlicher gemacht haben!
Tim Diekmann

2

Versuche dies. Geben Sie den folgenden Code in die Schaltfläche ein.

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

Hier ist ein lustiges Beispiel 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

Hier ist eine ziemlich einfache Funktion von 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()

    }

Sie müssen die Nachricht als Zeichenfolge übergeben, in der Sie diese Funktion verwenden.


1

Der alte Weg: 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 {

    // ...
   }
  }

Der neue Weg: 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

Unter iOS 9 können Sie dies tun

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

// Generische Klasse für 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)
        }
    }
}
}

Verwenden:-

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

Können Sie dem von Ihnen geposteten Code bitte eine Erklärung hinzufügen? So wie es jetzt ist, ist Ihre Antwort nach SO-Regeln nicht wirklich eine gute Antwort.
Nico Van Belle

Alarmansicht hat sich jetzt in schnell geändert 4. Verwenden Sie Alarm-Controller
Sandeep Singh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.