UIAlertAction에 대한 핸들러 작성


104

UIAlertView사용자 에게 a 를 제시하고 있는데 처리기를 작성하는 방법을 알 수 없습니다. 이것은 내 시도입니다.

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

핸들러에 self 대신 (alert : UIAlertAction!)을 넣으십시오. 이렇게하면 코드가 다음과 같이 보일 것입니다.

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

이것은 Swift에서 핸들러를 정의하는 적절한 방법입니다.

Brian이 아래에서 지적했듯이 이러한 처리기를 정의하는 더 쉬운 방법도 있습니다. 그의 방법을 사용하는 방법은 책에서 논의됩니다. Closures 섹션을보십시오.


9
{alert in println("Foo")}, {_ in println("Foo")}{println("Foo")}도 작동해야합니다.
Brian Nickel

7
@BrianNickel : 세 번째는 인수 작업을 처리해야하기 때문에 작동하지 않습니다. 그러나 그 외에도 UIAlertActionStyle.Default를 신속하게 작성할 필요가 없습니다. .Default도 작동합니다.
Ben

"let 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 2015-08-08

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

기본 제목, 두 가지 작업 (저장 및 삭제) 및 취소 버튼이있는 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

신속한 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. 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. 목표 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.