UIAlertActionの書き込みハンドラ


104

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

ハンドラーに自分自身の代わりに(alert: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:引数アクションを処理する必要があるため、3つ目は機能しません。ただし、それに加えて、UIAlertActionStyle.Defaultを迅速に記述する必要はありません。.Defaultも機能します。
2014

それが道というかなりいいに見える-あなたは「聞かせFOO = UIAlertAction(...)を使用する場合は、あなたがUIAlertAction後の長い閉鎖かもしれないものを置くために、末尾の閉鎖構文を使用できることに注意してください。
デビッド・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 2015

1
関数 Swiftのクロージャーです:)私はかなりクールでしたが。:ドキュメントチェックアウトdeveloper.apple.com/library/ios/documentation/Swift/Conceptual/...
kakubei

17

あなたは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")
 }))

上記のすべての答えは正しいです。実行できる別の方法を示しています。


11

メインタイトル、2つのアクション(保存と破棄)、キャンセルボタンを持つ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ベータ3)で動作します


7

Swift 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. 目的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];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.