Swift - 如何在自定义AlertController

时间:2017-01-11 10:51:41

标签: ios swift uialertcontroller

我在Swift 2.3中开发

我有一个Utils类,可以让我轻松创建UIAlertController。

public class Utils {

    class func buildAlertInfo(withTitle title: String?, andMessage message: String?, withHandler handler: (UIAlertAction -> Void)?) -> UIAlertController {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
        alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: handler))

        return alertController
    }
}

它使我能够轻松构建AlertController:

let alert = Utils.buildAlertInfo(withTitle: "Information", andMessage: "John Snow is dying", withHandler: nil)
self.presentViewController(alert, animated: false, completion: nil)

我现在的问题是我想在我的Utils类中创建另一种类型的自定义警报。 例如,带有按钮的警报,用于将用户导航到特定的ViewController。

我不知道如何访问自定义类中的ViewController。也许在点击Button之后将我想要呈现的ViewController作为参数传递?

我是否应该尊重MVC模式而不与我的Utils类中的View进行交互?

编辑:

我想要的警报应该是这样的:

class func buildAlertInfoWithFavButton(withTitle title: String?, andMessage message: String?, withHandler handler: (UIAlertAction -> Void)?) -> UIAlertController {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
        alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: handler))
        alertController.addAction(UIAlertAction(title: "Favorite", style: UIAlertActionStyle.Default, handler: handler))

        return alertController
    }

OK操作相同,但Favorite操作应该导航到FavoriteViewController。

4 个答案:

答案 0 :(得分:2)

怎么样?
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)

答案 1 :(得分:2)

您仍然可以使用buildAlertInfo函数,并且可以像这样传递处理函数。

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

现在使用处理程序块

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

**编辑:**对于多个操作,您可以使用您的方法创建处理程序数组。

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
}

现在调用这个函数。

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

答案 2 :(得分:0)

更具体,并在任何类项目中使用该方法。为此,在 NSObject 类中创建一个函数。像:

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)
    }

控制器中,我将调用该方法并执行所需的工作,如:

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

注意:此处提醒 NSObject 类的名称。

答案 3 :(得分:0)

我建议使用segue标识符作为传递参数(确保引用一个在ViewController中启动的segue,你调用" buildAlert"函数来自。)

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
}

这也可以在不创建新函数的情况下实现,只需将处理程序部分从上面作为参数发送到您已有的函数,如下所示:

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

编辑:请注意,发件人部分可以是在ViewController中发生函数调用的@IBOutlet引用的任何对象