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

后端 未结 4 420
失恋的感觉
失恋的感觉 2021-01-28 03:31

I am developing in Swift 2.3

I have an Utils class enabling me to create UIAlertController easily.

public class Utils {

    cl         


        
相关标签:
4条回答
  • 2021-01-28 03:37

    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])
    
    0 讨论(0)
  • 2021-01-28 03:40

    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

    0 讨论(0)
  • 2021-01-28 03:42

    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)
    

    ?

    0 讨论(0)
  • 2021-01-28 03:47

    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.

    0 讨论(0)
提交回复
热议问题