Escrevendo manipulador para UIAlertAction

104

Estou apresentando um UIAlertViewao usuário e não consigo descobrir como escrever o manipulador. Esta é minha tentativa:

let alert = UIAlertController(title: "Title",
                            message: "Message",
                     preferredStyle: UIAlertControllerStyle.Alert)

alert.addAction(UIAlertAction(title: "Okay",
                              style: UIAlertActionStyle.Default,
                            handler: {self in println("Foo")})

Eu recebo um monte de problemas no Xcode.

A documentação diz convenience init(title title: String!, style style: UIAlertActionStyle, handler handler: ((UIAlertAction!) -> Void)!)

Os blocos / fechamentos inteiros estão um pouco além da minha cabeça no momento. Qualquer sugestão é muito apreciada.

Steve Marshall
fonte

Respostas:

165

Em vez de self em seu manipulador, coloque (alerta: UIAlertAction!). Isso deve fazer com que seu código fique assim

    alert.addAction(UIAlertAction(title: "Okay",
                          style: UIAlertActionStyle.Default,
                        handler: {(alert: UIAlertAction!) in println("Foo")}))

esta é a maneira adequada de definir manipuladores em Swift.

Como Brian apontou abaixo, também existem maneiras mais fáceis de definir esses manipuladores. O uso de seus métodos é discutido no livro, veja a seção intitulada Closures

jbman223
fonte
9
{alert in println("Foo")},, {_ in println("Foo")}e {println("Foo")}também deve funcionar.
Brian Nickel
7
@BrianNickel: O terceiro não funciona porque você precisa lidar com a ação do argumento. Mas, além disso, você não precisa escrever UIAlertActionStyle.Default rapidamente. .O padrão funciona também.
Ben
Observe que se você usar "let foo = UIAlertAction (...), então você pode usar a sintaxe de encerramento final para colocar o que pode ser um encerramento longo após UIAlertAction - fica bem assim.
David H
1
Esta é uma maneira elegante de escrever isso:alert.addAction(UIAlertAction(title: "Okay", style: .default) { _ in println("Foo") })
Harris
74

Funções são objetos de primeira classe em Swift. Então, se você não quiser usar um encerramento, você também pode apenas definir uma função com a assinatura apropriada e depois passá-la como o handlerargumento. Observar:

func someHandler(alert: UIAlertAction!) {
    // Do something...
}

alert.addAction(UIAlertAction(title: "Okay",
                              style: UIAlertActionStyle.Default,
                              handler: someHandler))
Rob Johansen
fonte
como deve ser essa função de manipulador em objetivo-C?
andilabs
1
Funções são fechamentos em Swift :) que eu achei muito legal. Confira os documentos: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
kakubei
17

Você pode fazer isso de forma simples, usando o swift 2:

let alertController = UIAlertController(title: "iOScreator", message:
        "Hello, world!", preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Destructive,handler: { action in
        self.pressed()
}))

func pressed()
{
    print("you pressed")
}

    **or**


let alertController = UIAlertController(title: "iOScreator", message:
        "Hello, world!", preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Destructive,handler: { action in
      print("pressed")
 }))

Todas as respostas acima estão corretas, estou apenas mostrando uma outra maneira que pode ser feita.

Korpel
fonte
11

Vamos supor que você deseja um UIAlertAction com título principal, duas ações (salvar e descartar) e o botão Cancelar:

let actionSheetController = UIAlertController (title: "My Action Title", message: "", preferredStyle: UIAlertControllerStyle.ActionSheet)

    //Add Cancel-Action
    actionSheetController.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))

    //Add Save-Action
    actionSheetController.addAction(UIAlertAction(title: "Save", style: UIAlertActionStyle.Default, handler: { (actionSheetController) -> Void in
        print("handle Save action...")
    }))

    //Add Discard-Action
    actionSheetController.addAction(UIAlertAction(title: "Discard", style: UIAlertActionStyle.Default, handler: { (actionSheetController) -> Void in
        print("handle Discard action ...")
    }))

    //present actionSheetController
    presentViewController(actionSheetController, animated: true, completion: nil)

Isso funciona para o swift 2 (Xcode versão 7.0 beta 3)

polarware
fonte
7

Mudança de sintaxe no swift 3.0

alert.addAction(UIAlertAction(title: "Okay",
                style: .default,
                handler: { _ in print("Foo") } ))
Fangming
fonte
7

Em Swift 4:

let alert=UIAlertController(title:"someAlert", message: "someMessage", preferredStyle:UIAlertControllerStyle.alert )

alert.addAction(UIAlertAction(title: "ok", style: UIAlertActionStyle.default, handler: {
        _ in print("FOO ")
}))

present(alert, animated: true, completion: nil)
Mohamad Taghadosi
fonte
4

é assim que eu faço com o xcode 7.3.1

// create function
func sayhi(){
  print("hello")
}

// cria o botão

let sayinghi = UIAlertAction(title: "More", style: UIAlertActionStyle.Default, handler:  { action in
            self.sayhi()})

// adicionando o botão ao controle de alerta

myAlert.addAction(sayhi);

// todo o código, este código irá adicionar 2 botões

  @IBAction func sayhi(sender: AnyObject) {
        let myAlert = UIAlertController(title: "Alert", message:"sup", preferredStyle: UIAlertControllerStyle.Alert);
        let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler:nil)

        let sayhi = UIAlertAction(title: "say hi", style: UIAlertActionStyle.Default, handler:  { action in
            self.sayhi()})

        // this action can add to more button
        myAlert.addAction(okAction);
        myAlert.addAction(sayhi);

        self.presentViewController(myAlert, animated: true, completion: nil)
    }

    func sayhi(){
        // move to tabbarcontroller
     print("hello")
    }
Alan
fonte
4

criar alerta, testado no xcode 9

let alert = UIAlertController(title: "title", message: "message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: self.finishAlert))
self.present(alert, animated: true, completion: nil)

e a função

func finishAlert(alert: UIAlertAction!)
{
}
luhuiya
fonte
2
  1. In Swift

    let alertController = UIAlertController(title:"Title", message: "Message", preferredStyle:.alert)
    
    let Action = UIAlertAction.init(title: "Ok", style: .default) { (UIAlertAction) in
        // Write Your code Here
    }
    
    alertController.addAction(Action)
    self.present(alertController, animated: true, completion: nil)
  2. No Objetivo C

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *OK = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action)
    {
    }];
    
    [alertController addAction:OK];
    
    [self presentViewController:alertController animated:YES completion:nil];
Tecnologia Silversky
fonte