Swift - How to present ViewController when tapping button in a custom AlertController

谁都会走 提交于 2019-12-02 10:33:12

You can still use your buildAlertInfo function and can pass handler function like this way.

//Add function in your controller
func handler(action: UIAlertAction) {
    //Add code of present
}

Now pass this function with your handler block

let alert = Utils.buildAlertInfo(withTitle: "Information", 
                                andMessage: "John Snow is dying",
                               withHandler: self.handler)

**Edit:**For multiple action you can create array of handler with your method like this.

func buildAlertInfoWithFavButton(withTitle title: String?, andMessage message: String?, withHandler handler: [((UIAlertAction) -> Void)]?) -> UIAlertController {

    alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: handler.first))
    alertController.addAction(UIAlertAction(title: "Favorite", style: UIAlertActionStyle.Default, handler: handler.last))
}

//Ok handler
func okHandler(action: UIAlertAction) {
    //Add code of present
}

//Favorite handler
func favoriteHandler(action: UIAlertAction) {
    //Add code of present
}

Now call the function like this.

let alert = Utils.buildAlertInfo(withTitle: "Information", 
                                andMessage: "John Snow is dying",
                               withHandler: [okHandler, favoriteHandler])

What about

let alert = Utils.buildAlertInfo(
  withTitle: "Information",
  andMessage: "John Snow is dying",
  withHandler: { action in self.go(to: specificViewController) }
)
self.presentViewController(alert, animated: false, completion: nil)

?

To be more Specific and use that method in any class of project. For this make a function in NSObject class. Like:

open  class func showAlert(_ delegate: UIViewController, message: String ,strtitle: String, handler:((UIAlertAction) -> Void)! = nil)
    {
        let alert = UIAlertController(title: strtitle, message: message, preferredStyle: UIAlertControllerStyle.alert)

        if handler == nil{
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))

        }
        else
        {
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: handler))
        }

        delegate.present(alert, animated: true, completion: nil)
    }

In Controller I will call the method and do the required work like:

 Alert.showAlert(self, message: "Message", strtitle: "Tittle!!", handler: {
                        (action : UIAlertAction) in
                  //Do your Work here
                })

Note: Here Alert is name of NSObject class.

I would suggest using segue identifiers as the passed parameter (make sure you reference a segue that starts in the ViewController you call the "buildAlert" function from).

public class Utils {

class func buildAlertInfo(withTitle title: String?, andMessage message: String?, withSegue segueIdentifier: String?, sender: Any?) -> UIAlertController {
    let alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
    alertController.addAction(UIAlertAction(title: "OK", style: .Default, handler: handler: {
                action in
                self.performSegue(withIdentifier: segueIdentifier, sender: sender)
            })

    return alertController
}

This can also be achieved without creating a new function, just sending the handler part from above as a parameter to the function you already have, like this:

let alert = Utils.buildAlertInfo(withTitle: "Information", andMessage: "John Snow is dying", withHandler: {
                action in
                self.performSegue(withIdentifier: "mySegueIdentifier", sender: self)
            })

EDIT: Note that the sender part can be any object that has an @IBOutlet reference in the ViewController the function call takes place

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