Написання обробника для UIAlertAction


104

Я представляю користувачеві a, UIAlertViewі я не можу зрозуміти, як написати обробник. Це моя спроба:

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

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

Я отримую купу питань у Xcode.

У документації йдеться convenience init(title title: String!, style style: UIAlertActionStyle, handler handler: ((UIAlertAction!) -> Void)!)

Наразі цілі блоки / закриття трохи над головою. Будь-яка пропозиція високо цінується.

Відповіді:


165

Замість того, щоб увійти в обробник, поставте (попередження: UIAlertAction!). Це має зробити ваш код таким чином

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

це правильний спосіб визначення обробників у Swift.

Як Брайан зазначив нижче, є й більш прості способи визначення цих обробників. Використання його методів обговорюється в книзі, дивіться у розділі під назвою Закриття


9
{alert in println("Foo")},, {_ in println("Foo")}і {println("Foo")}також повинні працювати.
Брайан Нікель

7
@BrianNickel: Третій не працює, тому що вам потрібно обробити дію аргументу. Але крім цього вам не потрібно швидко писати UIAlertActionStyle.Default. .За замовчуванням теж працює.
Бен

Зауважте, що якщо ви використовуєте "нехай foo = UIAlertAction (...), то ви можете використовувати синтаксис трейлінг-закриття, щоб поставити те, що може бути довгим закриттям після UIAlertAction - це виглядає досить приємно.
David H

1
Ось елегантний спосіб написати це:alert.addAction(UIAlertAction(title: "Okay", style: .default) { _ in println("Foo") })
Харріс

74

Функції - це першокласні об'єкти в Swift. Тож якщо ви не хочете використовувати закриття, ви також можете просто визначити функцію відповідною підписом, а потім передати її як handlerаргумент. Дотримуйтесь:

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

alert.addAction(UIAlertAction(title: "Okay",
                              style: UIAlertActionStyle.Default,
                              handler: someHandler))

як повинна виглядати ця функція обробника в Objective-C?
andilabs

1
Функції є закриття у Swift :) котрий я хоч був досить прохолодний. Ознайомтеся з документами: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
kakubei

17

Ви можете зробити це так просто, використовуючи швидкий 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")
 }))

Усі відповіді вище правильні, я просто показую інший спосіб, який можна зробити.


11

Давайте припустимо, що вам потрібно UIAlertAction з основним заголовком, двома діями (збереження та викидання) та кнопкою скасування:

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)

Це працює для swift 2 (версія Xcode 7.0 beta 3)


7

Зміна синтаксису у швидкому 3.0

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

7

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

4

ось як я це роблю з xcode 7.3.1

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

// створити кнопку

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

// додавання кнопки до керування сповіщенням

myAlert.addAction(sayhi);

// весь код, цей код додасть 2 кнопки

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

4

створити попередження, перевірене в 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)

і функції

func finishAlert(alert: UIAlertAction!)
{
}

2
  1. У Свіфт

    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. В Цілі С

    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];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.