Jak mam utworzyć UIAlertView w Swift?

481

Pracowałem nad stworzeniem UIAlertView w Swift, ale z jakiegoś powodu nie mogę poprawnie wyciągnąć instrukcji, ponieważ otrzymuję ten błąd:

Nie można znaleźć przeciążenia dla parametru „init”, które akceptuje podane argumenty

Oto jak to napisałem:

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

Aby to nazwać, używam:

button2Alert.show()

W tej chwili ulega awarii i po prostu wydaje mi się, że nie mam poprawnej składni.

BlueBear
źródło
5
UIAlertViewi UIActionSheetzostał zastąpiony przez UIAlertControllerw iOS 8, czy już na to spojrzałeś?
Popeye
Upewnij się, że klasa selfnależąca do przyjmuje protokół UIAlertViewDelegate(zalecanym sposobem na to, w Swift, jest rozszerzenie).
Nicolas Miari
@Adam: Cofam zmiany tagów. Swift3 znacznik jest za „pytania bezpośrednio związane ze zmianami w wersji 3 języku programowania Swift Apple.” I nie sądzę, że „Jeśli odpowiedzi jasno stwierdzą, że problem w pytaniu był spowodowany czymś innym niż to, co myślał pytający, zmiana tagów jest bardzo pomocna”. z meta.stackoverflow.com/questions/252079/... obowiązuje tutaj.
Martin R
1
@MartinR Nie wiem, w jaki sposób można zaktualizować pytania, aby pokazać, że istnieją odpowiedzi, które dotyczą aktualnej wersji Swift; jest tu wiele starych, bezużytecznych rzeczy i [szybki] znajduje to wszystko razem z pożytecznymi. Nie czuję się mocno z powodu wycofania tego znacznika, ale chciałbym, aby istniał ostateczny sposób rozwiązania tego problemu. (Chciałbym, żeby odpowiedzi miały tagi).
Adam Eberbach,

Odpowiedzi:

897

Z UIAlertViewklasy:

// UIAlertView jest przestarzałe. Zamiast tego należy użyć UIAlertController z preferowanym stylem UIAlertControllerStyleAlert

W systemie iOS 8 możesz to zrobić:

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)

Teraz UIAlertControllerjest pojedyncza klasa do tworzenia i interakcji z tym, co wiemy, jak UIAlertViewsi UIActionSheety na iOS 8.

Edycja: Aby obsłużyć działania:

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

Edycja dla 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)

Edycja dla 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)
Oscar Swanros
źródło
3
Gdzie widziałeś, że UIAlertView jest nieaktualny? Nie widzę tego w dokumentacji?
BlueBear
9
Cmd + Kliknij UIAlertViewklasę, a komentarz znajduje się bezpośrednio nad deklaracją klasy.
Oscar Swanros
2
Odpowiem na własne pytanie dla każdego, kto jest ciekawy alert.addAction (UIAlertAction (tytuł: „Cancel”, styl: UIAlertActionStyle.Cancel, handler: {(ACTION: UIAlertAction!) In})))
altyus
5
Jaki jest sens przypadków anulowania i niszczenia, ponieważ zawsze będzie to to, co określiłeś .Default?
Użytkownik
4
Czytanie tej odpowiedzi nie jest konieczne . Przełącznik jest użyteczny tylko wtedy, gdy typ lub tytuł nie są zakodowane na stałe, tj. Są dynamiczne: możesz mieć szereg dynamicznych przycisków, więc tytuły nie są zakodowane na stałe. I wtedy program obsługi może być zmuszony przekazać wybrany tytuł do innego wywołania metody
Honey,
465

Jeden przycisk

Zrzut ekranu jednego przycisku

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

Dwa przyciski

Zrzut ekranu ostrzeżenia o dwóch przyciskach

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

Trzy przyciski

wprowadź opis zdjęcia tutaj

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

Obsługa zaworów przycisków

handlerBył nilw powyższych przykładach. Można wymienić nilz zamknięciem coś zrobić, gdy użytkownik kliknie przycisk. Na przykład:

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

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

}))

Notatki

  • Wiele przycisków niekoniecznie musi używać różnych UIAlertAction.Styletypów. Wszyscy mogą być .default.
  • W przypadku więcej niż trzech przycisków rozważ użycie arkusza akcji. Konfiguracja jest bardzo podobna. Oto przykład.
Suragch
źródło
2
czy w UIAlertController jest jakaś właściwość delegowania? w UIAlertView znajduje się właściwość delegowania, którą kiedyś ustawiamy na siebie. Czy w UIAlertController jest coś takiego? Jestem nowy, pomóżcie mi
ArgaPK
Piękna odpowiedź - w jaki sposób możemy przejść do nowego widoku w module obsługi?
That1Guy,
114

Możesz utworzyć UIAlert za pomocą standardowego konstruktora, ale ten „starszy” wydaje się nie działać:

let alert = UIAlertView()
alert.title = "Alert"
alert.message = "Here's a message"
alert.addButtonWithTitle("Understood")
alert.show()
Ben Gottlieb
źródło
8
UIAlertView jest przestarzały. Zamiast tego należy użyć UIAlertController z preferowanym stylem UIAlertControllerStyleAlert.
Zorayr
16
@Zorayr UIAlertController jest dostępny tylko w systemie iOS 8 i nowszych, należy również wspomnieć o tym, sugerując jego użycie. Są sytuacje, w których obsługa iOS7 jest nadal pożądana i ludzie mogą przegapić problem. Odstąpienie nie oznacza „nigdy więcej tego nie używaj”.
Sami Kuhmonen,
2
Działa to, jeśli twoja aplikacja nadal jest kierowana na iOS 7. Jednak idealnie UIAlertView powinien być używany tylko wtedy, gdy UIAlertController nie jest dostępny. if NSClassFromString („UIAlertController”)! = zero {/ * użyj UIAlertController * /} else {/ * użyj UIAlertView * /}
phatblat
UIAlertview () jest teraz przestarzałe w iOS 9
Rizwan Ahmed
31

W Swift 4.2 i Xcode 10

Metoda 1:

PROSTY ALERT

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

Metoda 2:

ALERT Z AKCJĄ UDOSTĘPNIONĄ

Jeśli chcesz Współdzielony styl klasy (napisz raz, użyj gdziekolwiek)

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

Teraz zadzwoń w ten sposób do każdego produktu

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

Metoda 3:

OBECNY ALERT NA GÓRĘ WSZYSTKICH WINDOWS

Jeśli chcesz przedstawić alert obok wszystkich widoków, użyj tego kodu

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

Wywołanie funkcji

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

Metoda 4:

Alert z rozszerzeniem

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

Teraz zadzwoń tak

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

Metoda 5:

ALERT Z TEKSTAMI

Jeśli chcesz dodać pola tekstowe do powiadomienia.

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

}

Metoda 6:

Alert w SharedClass z rozszerzeniem

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

Teraz zadzwoń bezpośrednio w ten sposób

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

Metoda 7:

Alarmuj bez wspólnej klasy z rozszerzeniem w osobnej klasie dla powiadomienia.

Utwórz jedną nową klasę Swift i import UIKit. Skopiuj i wklej poniżej kodu.

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

Teraz zadzwoń do funkcji ostrzegania w ten sposób we wszystkich klasach (pojedyncza linia).

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

Jak to jest....

iOS
źródło
Perfekt! +1 Czy możesz dodać metodę ze zintegrowanym limitem czasu? Dzięki!
PascalS,
@ Passe, przepraszam, nie rozumiem, mogę krótko wyjaśnić.
iOS
Potrzebuję alertController, który jest prezentowany do momentu kliknięcia przycisku „OK” lub przekroczenia limitu czasu. Coś jak metoda 6 lub 7, ale z dodatkową zmienną wejściową „limit czasu”.
PascalS,
rozszerzenie UIViewController {func alertWithTime (title: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (tytuł: tytuł, wiadomość: msg, preferowany styl: .alert) alert.addAction (UIAlertAction (tytuł : „OK”, styl: .default, moduł obsługi: zero)) self.present (alert, animowane: true, zakończenie: zero) jeśli #available (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, powtarza: fałsz , blok: {_ in alert.dismiss (animowane: prawda, zakończenie: zero)})} else {// Powrót do wcześniejszych wersji}}}}
iOS
1
Jeśli w tym przypadku podasz timeInterval 0, jeśli nie chcesz zamykać alertu, użyj warunku if. if timeInterval != 0 { if #available(iOS 10.0, *) { Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { _ in alert.dismiss(animated: true, completion: nil) }) } else { // Fallback on earlier versions } }
iOS
19

Kliknij Widok

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

}

Gotowe z dwoma przyciskami OK i Anuluj

Hiren Patel
źródło
12

Jeśli celujesz w iOS 7 i 8, potrzebujesz czegoś takiego, aby upewnić się, że używasz właściwej metody dla każdej wersji, ponieważ UIAlertViewjest przestarzała w iOS 8, ale UIAlertControllernie jest dostępna w iOS 7:

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

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

        alert.show()
    }
}
AstroCB
źródło
Możesz też zaoszczędzić czas i korzystać z niego, UIAlertViewdopóki nie zrezygnujesz z obsługi systemu iOS 7. Apple nie odrzuci Twojej aplikacji.
cprcrack
2
Wycofanie nie oznacza „nie używaj tego” lub że byłaby to „zła metoda”, to po prostu oznacza, że ​​nie będzie działać później. Nie trzeba specjalnie używać UIAlertController na iOS8, jeśli potrzebne są tylko podstawowe alerty. Będą działać jak poprzednio. Istnieje wiele interfejsów API, które zostały przestarzałe w iOS4 lub 5 i nadal działają w iOS8. Ale oczywiście aplikacje kierowane na wyższy poziom iOS nie powinny ich używać i dlatego pojawia się ostrzeżenie o wycofaniu.
Sami Kuhmonen
1
@SamiKuhmonen Nie, ale wyjaśnia, dlaczego robisz to, co robisz i ułatwia usuwanie wsparcia dla przestarzałych metod, gdy minimalna wersja jest wystarczająco wysoka, aby to zrobić.
AstroCB,
12

Rozszerzenia protokołu Swift 2 umożliwiają utworzenie protokołu zapewniającego domyślną implementację kontrolerów widoku:

ShowsAlert.swift

import UIKit

protocol ShowsAlert {}

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

ViewController.swift

class ViewController: UIViewController, ShowsAlert {
    override func viewDidLoad() {
        super.viewDidLoad()
        showAlert(message: "Hey there, I am an error message!")
    }
}
knshn
źródło
1
Działa świetnie. W przypadku Swift3 zmień opcję „presentViewController” na „present”.
Vincent
11

Pokaż UIAlertView w szybkim języku: -

Protokół UIAlertViewDelegate

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

Pokaż UIAlertViewController w szybkim języku: -

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)
Anit Kumar
źródło
11

Po prostu nie udostępniaj otherButtonTitles w konstruktorze.

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

alertView.show()

Ale zgadzam się z Oscarem, ta klasa jest przestarzała w iOS 8, więc nie będziesz używać UIAlertView, jeśli robisz aplikację tylko na iOS 8. W przeciwnym razie powyższy kod będzie działał.

Peymankh
źródło
9

Znalazłem ten

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

nie dobrze, ale działa :)

Aktualizacja:

ale znalazłem w pliku nagłówkowym jako:

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

ktoś może to wyjaśnić.

Mujah Maskey
źródło
Najwyraźniej UIAlertView został przestarzały w iOS 8 i teraz używamy UIAlertController z preferowanym stylem UIAlertControllerStyleAlert.
BlueBear,
6
Jeśli uruchomisz aplikację, która musi być wstecznie kompatybilna z iOS7.1 i piszesz ją w Swift, UIAlertController spowoduje awarię urządzenia docelowego. Musisz obsługiwać starsze UIAlertViews dla iOS7.
Joe
Myślę, że to nie Swift spowodowałby awarię, ale fakt, że UIAlertController nie jest dostępny przed iOS 8
Frédéric Adda
7

Myślę , że w przypadku SWIFT4 rozszerzenie UIViewControlleri utworzenie kontroli potwierdzeń wielokrotnego użytku jest najbardziej eleganckim sposobem.

Możesz przedłużyć, UIViewControllerjak poniżej:

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

Następnie możesz go użyć w dowolnym momencie:

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

        } else { //User has clicked on Cancel

        }
    }
emreoktem
źródło
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")
                }
            }
        }
    }
Jayesh Miruliya
źródło
Samo napisanie kawałka kodu nie jest zbyt przydatne. Odpowiadając na dowolne pytanie (szczególnie stare pytanie z kilkoma odpowiedziami, w tym zaakceptowaną odpowiedzią), napisz więcej niż fragment kodu. Dodaj wyjaśnienie tego, co robi Twój kod, jak odpowiada na pytanie i jak różni się (lub lepiej) od innych odpowiedzi.
AdrianHHH
5

Mam inną sztuczkę. Załóżmy, że masz 5 klas, w których należy zastosować alert wylogowania. Spróbuj z szybkim rozszerzeniem klasy.

File- New- Swift class- Name it.

Dodaj następujące:

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

Zaimplementuj za pomocą: self.makeLogOutAlert (). Mam nadzieję, że to pomoże.

AG
źródło
5

Zrobiłem lekcję singleton, aby uczynić to wygodne w użyciu z dowolnego miejsca w Twojej aplikacji: https://github.com/Swinny1989/Swift-Popups

Następnie możesz utworzyć wyskakujące okienko z wieloma przyciskami jak poniżej:

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

lub wyskakujące okienka z jednym takim przyciskiem:

Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.")
Swinny89
źródło
Dzięki. Zgłaszam tam jakiś problem
djdance
1
Hej @ Swinny89 Dziękuję bardzo za podzielenie się z nami tym rozwiązaniem! Utknąłem z zamknięciem, a ty mnie uratowałeś!
Bruno Campos
5

Szybki 3

Poniżej znajduje się prosty przykład, jak utworzyć prosty alert za pomocą jednego przycisku w Swift 3.

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

W powyższym przykładzie pominięto uchwyt wywołania akcji, ponieważ domyślnym zachowaniem widoku alertu z jednym przyciskiem jest zniknięcie po kliknięciu tego przycisku.

Oto, jak utworzyć kolejną akcję, którą można dodać do alertu za pomocą „alert.addAction (akcja)”. Różne style to .default, .destructive i .cancel.

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

źródło
4

Mam następujący UIAlertViewkod inicjalizacyjny, aby skompilować bez błędów (myślę, że ostatnia, odmienna część jest chyba trudna). Ale musiałem się upewnić, że klasa self(którą przekazuję jako delegat) przyjmuje UIAlertViewDelegateprotokół, aby błędy kompilacji zniknęły:

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

Nawiasem mówiąc, jest to błąd, który otrzymałem (od Xcode 6.4):

Nie można znaleźć inicjatora typu „UIAlertView”, który akceptuje listę argumentów typu „(tytuł: ciąg, komunikat: ciąg, delegat: MyViewController, cancelButtonTitle: ciąg, otherButtonTitles: ciąg)”

Jak wspomniano inni, należy przeprowadzić migrację do UIAlertController, jeśli można kierować system iOS 8.x +. Aby obsługiwać iOS 7, użyj powyższego kodu (iOS 6 nie jest obsługiwany przez Swift).

Nicolas Miari
źródło
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)

}
Mr.Javed Multani
źródło
4

Możesz użyć tego prostego rozszerzenia z liczbą przycisków n i powiązanymi akcjami swift4 i nowszymi

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

możesz go używać w taki sposób,

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]) 
midhun p
źródło
proszę nie publikować duplikatów odpowiedzi. Jeśli chcesz edytować swoją odpowiedź.
iOS
Doskonała odpowiedź. To jest to, czego potrzebuję. Dziękuję Ci!
Gregory Wilson Pullyattu
3

Powód, dla którego nie działa, ponieważ niektóre wartości przekazane do funkcji są nieprawidłowe. swift nie lubi Objective-C, możesz ustawić zero na argumenty typu klasy bez żadnych ograniczeń (być może). Argument otherButtonTitles jest zdefiniowany jako nieobowiązkowy, którego typ nie ma na końcu (?). więc musisz przekazać konkretną wartość.

Oscar Wu
źródło
3
@IBAction func Alert(sender: UIButton) {

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

    alertView.show()

}

Spróbuj tego

gskril
źródło
3

Użyj tego kodu, aby wyświetlić widok alertów

  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)

Odniesienie: Swift Show Alert za pomocą UIAlertController

Shaba Aafreen
źródło
3

w xcode 9

let alert = UIAlertController(title: "Alert", message: "message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
luhuiya
źródło
3

SWIFT 4: Po prostu utwórz rozszerzenie UIViewController w następujący sposób:

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

Teraz w twoim ViewController, bezpośrednio wywołaj powyższą funkcję, tak jakby były one dostarczane przez UIViewController.

    yourViewController.showSuccessAlert(withTitle: 
      "YourTitle", andMessage: "YourCustomTitle")
Shikha Budhiraja
źródło
Zasadniczo odpowiedzi są o wiele bardziej pomocne, jeśli zawierają wyjaśnienie, do czego służy kod i dlaczego rozwiązuje problem bez przedstawiania innych. Dziękujemy za poprawę wartości referencyjnej odpowiedzi i uczynienie jej bardziej zrozumiałą!
Tim Diekmann
2

Spróbuj tego. Umieść przycisk poniżej kodu.

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)
Sagar Sangani
źródło
1

Oto zabawny przykład w Swift:

private func presentRandomJoke() {
  if let randomJoke: String = jokesController.randomJoke() {
    let alertController: UIAlertController = UIAlertController(title:nil, message:randomJoke, preferredStyle: UIAlertControllerStyle.Alert)
    alertController.addAction(UIAlertAction(title:"Done", style:UIAlertActionStyle.Default, handler:nil))
    presentViewController(alertController, animated:true, completion:nil)
  }
}
Zorayr
źródło
1

Oto dość prosta funkcja AlertView w 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()

    }

Musisz przekazać wiadomość jako ciąg znaków, w którym używasz tej funkcji.

iAnkit
źródło
1

Stara droga: 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 {

    // ...
   }
  }

Nowa droga: UIAlertController

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

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

 let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
// ...
 }
 alertController.addAction(OKAction)
 self.presentViewController(alertController, animated: true) {
 // ...
}
Shanmugasundharam
źródło
1

na IOS 9 możesz to zrobić

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)
Keshav Gera
źródło
1

// Klasa ogólna dla 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)
        }
    }
}
}

Posługiwać się:-

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
Pratyush Pratik
źródło
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()
Hitesh Chauhan
źródło
Czy możesz dodać wyjaśnienie do opublikowanego kodu? W tej chwili twoja odpowiedź tak naprawdę nie kwalifikuje się jako dobra odpowiedź na podstawie reguł SO.
Nico Van Belle
widok alertów zmienił się teraz w szybkim 4. użyciu kontrolera alertów
Sandeep Singh