How to create UIActionSheet actions?

女生的网名这么多〃 提交于 2019-12-24 12:04:12

问题


I know I have to set the delegate (I did so like this: class ShiftOverview: UITableViewController, UIActionSheetDelegate {...) but I'm still getting no response when I tap the buttons.

It doesn't look like you can set the delegate within the function with UIAlertController either...

 @IBAction func takeShift(sender: AnyObject) {

    let myActionSheet = UIAlertController (title: "Confirm", message: "Test message", preferredStyle: UIAlertControllerStyle.ActionSheet)

    let actionOne = UIAlertAction (title: "Take Shift", style: .Default, handler: nil)
    let actionTwo = UIAlertAction (title: "View ESA", style: .Default, handler: nil)

    let actionCancel = UIAlertAction (title: "Cancel", style: .Cancel, handler: nil)

    myActionSheet.addAction(actionOne)
    myActionSheet.addAction(actionTwo)
    myActionSheet.addAction(actionCancel)

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

func actionSheet (myActionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int)
{
    switch buttonIndex {

    case 0:
        println ("test0")
        break
    case 1:
        println ("test1")
        break
    case 2:
        println ("test2")
        break

    default:
        println("nope")

    }
}

回答1:


Prior to iOS 8, UIAlertViews and UIActionSheets were separate controls. In iOS 8 however, a new class, UIAlertController, combines both these controls into a single, easy to use class.

Rather than using the delegation pattern like these controls used to, you now pass a closure to be called. The places where you have handler equal to nil is where you put your code.

This is likely added because Swift treats closures as first-class citizens, while Objective C did not as much (with blocks).

It should be:

@IBAction func takeShift(sender: AnyObject) {

    let myActionSheet = UIAlertController (title: "Confirm", message: "Test message", preferredStyle: UIAlertControllerStyle.ActionSheet)

    let actionOne = UIAlertAction (title: "Take Shift", style: .Default, handler: { (action) in
        println("test0")
    })
    let actionTwo = UIAlertAction (title: "View ESA", style: .Default, handler: { (action) in
        println("test1")
    })

    let actionCancel = UIAlertAction (title: "Cancel", style: .Cancel, handler: { (action) in
        println("test2")
    })

    myActionSheet.addAction(actionOne)
    myActionSheet.addAction(actionTwo)
    myActionSheet.addAction(actionCancel)

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

Read more about this in NSHipster's article on UIAlertControllers or in its documentation.




回答2:


Instead of passing nil to your handler, you can write the action you want to perform. You don't need the delegate method anymore.

let actionOne = UIAlertAction (title: "Take Shift", style: .Default){ (action) -> Void in
         println ("Take Shift")
    };
let actionTwo = UIAlertAction (title: "View ESA", style: .Default){ (action) -> Void in
        println ("View ESA")
    };

let actionCancel = UIAlertAction (title: "Cancel", style: .Cancel){ (action) -> Void in
        println ("Cancel")
    };



回答3:


You may like to see this also:

func AlertViewWithActionsheet () {
        let alert = UIAlertController(title: "Alert with actionsheet", message: "Alert with actionsheet", preferredStyle: UIAlertControllerStyle.ActionSheet);

        let dismissHandler = {
            (action: UIAlertAction!) in
                // This is an action event - called when you press OK button.
                self.dismissViewControllerAnimated(true, completion: { () -> Void in
            })
        }

        // add action
        alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: dismissHandler))

        presentViewController(alert, animated: true) { () -> Void in
        }
    }


来源:https://stackoverflow.com/questions/27787777/how-to-create-uiactionsheet-actions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!