Como eu criaria um UIAlertView no Swift?

481

Estou trabalhando para criar um UIAlertView no Swift, mas por algum motivo não consigo acertar a instrução porque estou recebendo este erro:

Não foi possível encontrar uma sobrecarga para 'init' que aceita os argumentos fornecidos

Aqui está como eu o escrevi:

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

Então, para chamá-lo, estou usando:

button2Alert.show()

No momento, ele está travando e eu simplesmente não consigo entender a sintaxe corretamente.

BlueBear
fonte
5
UIAlertViewe UIActionSheetfoi substituído por UIAlertControllerno iOS 8, você já viu isso?
Popeye
Verifique se a classe que selfpertence a adota o protocolo UIAlertViewDelegate(a maneira recomendada de fazer isso, no Swift, é com uma extensão).
Nicolas Miari
@ Adam: Eu reverti sua marcação. A tag swift3 é para "perguntas diretamente relacionadas às alterações na versão 3 da linguagem de programação Swift da Apple". E não acho que "se as respostas deixarem claro que o problema na pergunta foi causado por algo diferente do que o autor da pergunta pensou, a recolocação é muito útil". de meta.stackoverflow.com/questions/252079/… se aplica aqui.
Martin R
1
@ Martinin Não sei como as perguntas podem ser atualizadas para mostrar que existem respostas que se aplicam a uma versão atual do Swift; há muitas coisas velhas e inúteis aqui e [swift] acha tudo junto com o útil. Não me sinto muito motivado com a revertida retag, mas gostaria que houvesse uma maneira definitiva de resolver esse problema. (Eu desejo respostas teve tags.)
Adam Eberbach

Respostas:

897

Da UIAlertViewclasse:

// UIAlertView está obsoleto. Use UIAlertController com um preferência de estilo UIAlertControllerStyleAlert

No iOS 8, você pode fazer isso:

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)

Agora UIAlertControlleré uma única classe para criar e interagir com o que sabíamos como UIAlertViews e UIActionSheets no iOS 8.

Editar: Para lidar com ações:

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

Editar para o 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)

Edite para o 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
fonte
3
Onde você viu que o UIAlertView está obsoleto? Não vejo isso na documentação?
bluebear
9
Cmd + Clique na UIAlertViewclasse e o comentário estará no topo da declaração da classe.
Oscar Swanros
2
Responderei minha própria pergunta para qualquer pessoa curiosa alert.addAction (UIAlertAction (title: "Cancel", style: UIAlertActionStyle.Cancel, manipulador: {(AÇÃO: UIAlertAction!) In}))})
altyus
5
Qual é o sentido dos casos Cancelar e Destrutivo, pois sempre será o que você especificou .Default?
Utilizador
4
Ler esta resposta é desnecessário . A opção é útil apenas se o tipo ou título não estiver codificado, ou seja, for dinâmico: você pode ter uma série de botões dinâmicos para que os títulos não sejam codificados. E, em seguida, o manipulador pode precisar para passar o título escolhido para algum outro chamada de método
Mel
465

Um botão

Captura de tela de um botão

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

Dois botões

Captura de tela do alerta de dois botões

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

Três botões

insira a descrição da imagem aqui

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

Manipulação de torneiras de botão

O handlerfoi nilnos exemplos acima. Você pode substituir nilpor um fechamento para fazer algo quando o usuário toca em um botão. Por exemplo:

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

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

}))

Notas

  • Vários botões não precisam necessariamente usar UIAlertAction.Styletipos diferentes . Todos eles poderiam ser .default.
  • Por mais de três botões, considere usar uma Folha de ação. A configuração é muito semelhante. Aqui está um exemplo.
Suragch
fonte
2
existe alguma propriedade delegada no UIAlertController? em UIAlertView, há uma propriedade delegada que, em algum momento, configuramos como self. Não existe nada parecido com isso em UIAlertController? Eu sou novo, por favor me ajude
ArgaPK
Bela resposta - Agora, como podemos mudar para uma nova visualização dentro do manipulador?
That1Guy
114

Você pode criar um UIAlert usando o construtor padrão, mas o 'legado' parece não funcionar:

let alert = UIAlertView()
alert.title = "Alert"
alert.message = "Here's a message"
alert.addButtonWithTitle("Understood")
alert.show()
Ben Gottlieb
fonte
8
UIAlertView está obsoleto. Use UIAlertController com umStyle preferido de UIAlertControllerStyleAlert.
Zorayr 12/01
16
O @Zorayr UIAlertController está disponível apenas no iOS 8 em diante; mencione também isso ao sugerir seu uso. Há situações em que o suporte ao iOS7 ainda é desejado e as pessoas podem perder o problema. Reprovação não significa "nunca mais use isso".
Sami Kuhmonen
2
Isso funciona se o seu aplicativo ainda estiver direcionado para o iOS 7. No entanto, o UIAlertView idealmente deve ser usado apenas quando o UIAlertController não estiver disponível. if NSClassFromString ("UIAlertController")! = nil {/ * use UIAlertController * /} else {/ * use UIAlertView * /}
phatblat
UIAlertview () agora está obsoleto no iOS 9
Rizwan Ahmed
31

No Swift 4.2 e no Xcode 10

Método 1 :

ALERTA SIMPLES

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

Método 2:

ALERTA COM CLASSE COMPARTILHADA

Se você deseja um estilo de classe compartilhada (escreva uma vez, use todos os lugares)

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

Agora chame alerta como este em todos os itens

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

Método 3:

ALERTA ATUAL TODO O TODO O WINDOWS

Se você deseja apresentar um alerta sobre todas as visualizações, use este código

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

Chamada de função

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

Método 4:

Alerta com extensão

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

Agora ligue assim

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

Método 5:

ALERTA COM CAMPOS DE TEXTO

Se você deseja adicionar campos de texto para alertar.

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

}

Método 6:

Alerta em SharedClass com extensão

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

Agora ligue diretamente assim

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

Método 7:

Alerta sem classe compartilhada com Extensão em classe separada para alerta.

Crie uma nova classe Swift e import UIKit. Copie e cole o código abaixo.

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

Agora chame a função de alerta como esta em todas as suas classes (linha única).

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

Como é....

iOS
fonte
Perfekt! +1 Você poderia adicionar um método com um tempo limite integrado? Obrigado!
precisa saber é
@ Passe, desculpe, eu não consigo entender, por favor, explique brevemente.
iOS
Eu preciso de um alertController que seja apresentado até o botão 'OK' ser clicado ou ocorrer um tempo limite. Algo como o método 6 ou 7, mas com uma variável de entrada adicional 'timeout'.
precisa saber é
extensão UIViewController {func alertWithTime (title: String, msg: String, timeInterval: TimeInterval) {DispatchQueue.main.async {let alert = UIAlertController (title: title, message: msg, selectedStyle: .alert) alert.addAction (UIAlertAction (title) : "OK", estilo: .default, manipulador: nil)) self.present (alerta, animação: true, conclusão: nil) se # disponível (iOS 10.0, *) {Timer.scheduledTimer (withTimeInterval: timeInterval, repete: false , bloco: {_ in alert.dismiss (animado: true, conclusão: nil)})} else {// Fallback em versões anteriores}}}}
iOS
1
Se você mencionar timeInterval 0 nesse caso, se não desejar fechar o alerta, use a condição 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

Clique em Visualizar

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

}

Concluído com dois botões OK e Cancelar

Hiren Patel
fonte
12

Se você estiver segmentando o iOS 7 e 8, precisará de algo assim para garantir que está usando o método certo para cada versão, porque UIAlertViewestá obsoleto no iOS 8, mas UIAlertControllernão está disponível no 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
fonte
Ou você pode economizar tempo e apenas usá- UIAlertViewlo até descartar o suporte para iOS 7. A Apple não rejeitará seu aplicativo por isso.
Cprcrack
2
Reprovação não significa "não use isso" ou que seria o "método errado", apenas significa que não funcionará mais tarde. Não há necessidade de usar especificamente o UIAlertController no iOS8, se for necessário apenas alertas básicos. Eles vão funcionar como antes. Existem muitas APIs que foram descontinuadas no iOS4 ou 5 e ainda funcionam no iOS8. Mas é claro que os aplicativos que têm um nível mais alto de iOS não devem usá-los e é por isso que há um aviso de descontinuação.
Sami Kuhmonen
1
@SamiKuhmonen Não, mas fica mais claro o motivo pelo qual você está fazendo o que está fazendo e facilita a remoção do suporte a métodos obsoletos quando a sua versão mínima é alta o suficiente.
precisa saber é o seguinte
12

Com as extensões de protocolo do Swift 2, você pode criar um protocolo que forneça uma implementação padrão para seus controladores de exibição:

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
fonte
1
Funciona perfeitamente. Para Swift3, altere 'presentViewController' para 'present'.
Vincent
11

Mostrar UIAlertView no idioma rápido: -

Protocolo UIAlertViewDelegate

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

Mostre o UIAlertViewController no idioma rápido: -

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
fonte
11

Simplesmente não forneça otherButtonTitles no construtor.

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

alertView.show()

Mas eu concordo com o Oscar, essa classe foi descontinuada no iOS 8, portanto não haverá uso do UIAlertView se você estiver usando um aplicativo exclusivo para iOS 8. Caso contrário, o código acima funcionará.

Peymankh
fonte
9

Eu encontrei esse

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

não é bom, mas funciona :)

Atualizar:

mas eu encontrei no arquivo de cabeçalho como:

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

alguém pode explicar isso.

Mujah Maskey
fonte
Aparentemente, o UIAlertView foi descontinuado no iOS 8 e agora usamos o UIAlertController com um estilo preferido de UIAlertControllerStyleAlert.
achou
6
Se você executa um aplicativo que precisa ser compatível com o iOS7.1 e o escreve no Swift, o UIAlertController trava o dispositivo de destino. Você precisa oferecer suporte ao UIAlertViews legado para iOS7.
Joe
Eu acho que não é o Swift que causaria um travamento, mas o fato de o UIAlertController não estar disponível antes do iOS 8
Frédéric Adda
7

Para o SWIFT4 , eu acho, estender UIViewControllere criar um controle de confirmação reutilizável é a maneira mais elegante.

Você pode estender o UIViewControllercomo abaixo:

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

Então você pode usá-lo a qualquer momento:

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

        } else { //User has clicked on Cancel

        }
    }
emreoktem
fonte
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
fonte
Apenas escrever um pedaço de código não é muito útil. Ao responder qualquer pergunta (especialmente uma pergunta antiga com várias respostas, incluindo uma resposta aceita), escreva mais do que um pedaço de código. Adicione uma explicação do que seu código faz, como ele responde à pergunta e como ele é diferente (ou melhor) do que as outras respostas.
AdrianHHH
5

Eu tenho outro truque. Suponha que você tenha 5 classes em que um alerta de logout será aplicado. Tente com extensão rápida de classe.

Arquivo- Nova- Classe Swift- Nomeie-o.

Adicione o seguinte:

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

Implemente usando: self.makeLogOutAlert (). Espero que ajude.

AG
fonte
5

Eu criei uma classe singleton para facilitar o uso em qualquer lugar do seu aplicativo: https://github.com/Swinny1989/Swift-Popups

Você pode criar um pop-up com vários botões como este:

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

ou pop-ups com um único botão como este:

Popups.SharedInstance.ShowPopup("Title goes here", message: "Message goes here.")
Swinny89
fonte
Obrigado. Eu submeto algum problema lá
djdance
1
Hey @ Swinny89 Muito obrigado por compartilhar esta solução conosco! Fiquei preso com a coisa do fechamento e você acabou de me salvar!
Bruno Campos
5

Swift 3

A seguir, é apresentado um exemplo simples de como criar um alerta simples com um botão no Swift 3.

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

No exemplo acima, o retorno de chamada de identificador da ação foi omitido porque o comportamento padrão de uma exibição de alerta com um botão é desaparecer quando o botão é clicado.

Veja como criar outra ação, que pode ser adicionada ao alerta com "alert.addAction (action)". Os diferentes estilos são: padrão, destrutivo e cancelado.

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

fonte
4

Eu consegui o seguinte UIAlertViewcódigo de inicialização para compilar sem erros (acho que a última parte variável é complicada, talvez). Mas eu tinha que ter certeza de que a classe self(da qual estou passando como delegada) estava adotando o UIAlertViewDelegateprotocolo para que os erros de compilação desaparecessem:

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

A propósito, este é o erro que eu estava recebendo (a partir do Xcode 6.4):

Não é possível encontrar um inicializador para o tipo 'UIAlertView' que aceita uma lista de argumentos do tipo '(título: String, mensagem: String, delegate: MyViewController, cancelButtonTitle: String, otherButtonTitles: String)'

Como outros mencionados, você deve migrar para o UIAlertController se conseguir direcionar o iOS 8.x +. Para oferecer suporte ao iOS 7, use o código acima (o iOS 6 não é suportado pelo Swift).

Nicolas Miari
fonte
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
fonte
4

Você pode usar esta extensão simples com n número de botões e ações associadas swift4 e acima

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

você pode usá-lo como,

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
fonte
por favor, não poste respostas duplicadas. Se você deseja editar sua resposta.
iOS
Excelente resposta. Isto é o que eu preciso. Obrigado!
Gregory Wilson Pullyattu
3

O motivo não funciona porque algum valor que você passou para a função não está correto. swift não gosta de Objective-C, você pode colocar nulo em argumentos que são do tipo classe sem nenhuma restrição (pode ser). O argumento otherButtonTitles é definido como não opcional, cujo tipo não possui (?) No final. então você deve passar um valor concreto para ele.

Oscar Wu
fonte
3
@IBAction func Alert(sender: UIButton) {

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

    alertView.show()

}

Tente isto

gskril
fonte
3

Use este código para exibir uma visualização de alerta

  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)

Referência: Swift Show Alert usando UIAlertController

Shaba Aafreen
fonte
3

no 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
fonte
3

SWIFT 4: simplesmente crie uma extensão para o UIViewController da seguinte maneira:

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

Agora, no seu ViewController, chame diretamente a função acima como se fosse fornecida pelo UIViewController.

    yourViewController.showSuccessAlert(withTitle: 
      "YourTitle", andMessage: "YourCustomTitle")
Shikha Budhiraja
fonte
Geralmente, as respostas são muito mais úteis se incluem uma explicação sobre o que o código pretende fazer e por que isso resolve o problema sem a introdução de outros. Obrigado por melhorar o valor de referência da resposta e torná-lo mais compreensível!
precisa
2

tente isto. Coloque o código abaixo no botão.

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
fonte
1

Aqui está um exemplo engraçado no 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
fonte
1

Aqui está uma função bastante simples do AlertView no 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()

    }

Você deve passar a mensagem como uma String onde você usa esta função.

iAnkit
fonte
1

O jeito antigo: 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 {

    // ...
   }
  }

A nova maneira: 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
fonte
1

no IOS 9, você pode fazer isso

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
fonte
1

// Classe genérica para 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)
        }
    }
}
}

Usar:-

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
fonte
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
fonte
Você pode, por favor, adicionar uma explicação ao código que você postou? Como é agora, sua resposta realmente não se qualifica como uma boa resposta pelas regras do SO.
Nico Van Belle
exibição de alerta mudou agora no controlador de alerta rápido 4.use
Sandeep Singh