在所有视图控制器中创建警报功能 - swift

create alert function in all view controllers - swift

我正在尝试声明一个用于在我的应用程序中显示警报的函数。为了避免重复工作,我试图对我的所有应用程序使用相同的功能。我试图通过创建一个带有函数 showNotification 的 class 来做到这一点。但是当我创建一个 class 的对象并调用该方法时,什么也没有发生。我该怎么做?

class SharedPropertiesAndMetods : UIViewController {

    func showNotification(title: String, message: String)
    {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "تائید", style: .default, handler: nil)
        alertController.addAction(defaultAction)
        present(alertController, animated: true, completion: nil)
    }

}

实际上你可以在class之外的任何地方声明一个简单的方法。

func showAlertWithCompletion(message:String,okTitle:String,cancelTitle:String?,completionBlock:@escaping (_ okPressed:Bool)->()){
    let alertController = UIAlertController(title: AppName, message: message, preferredStyle: .alert)
    let okAction = UIAlertAction(title: okTitle, style: .default) { (ok) in
        completionBlock(true)
    }
    alertController.addAction(okAction)
    if let cancelTitle = cancelTitle{
        let cancelOption = UIAlertAction(title: cancelTitle, style: .cancel, handler: { (axn) in
            completionBlock(false)

        })
        alertController.addAction(cancelOption)
    }

    if let topController = UIWindow.topViewController(){
      topController.present(alertController, animated: true, completion: nil)
    }

}

无论你在哪里调用它,你都会在完成句柄中获得确定按钮按下的回调,甚至可以按照@Ganesh Kumar 的描述进行扩展

使用这样的扩展程序

extension UIViewController {
  func showAlert(title: String, message: String) {
    let alertController = UIAlertController(title: title, message:
      message, preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: {action in
    }))
    self.present(alertController, animated: true, completion: nil)
  }
}

像这样调用函数

self.showAlert(title: "hi", message: "test")

为什么不只是扩展

extension UIViewController {

    func showNotification(title: String, message: String)
    {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "تائید", style: .default, handler: nil)
        alertController.addAction(defaultAction)
        present(alertController, animated: true, completion: nil)
    }
}

我要做的是创建一个 'generic' 视图控制器来完成这项工作,而不是继承它:

1.如果您想在每次出现视图时都显示警报:

class GenericViewController: UIViewController {

    // MARK: - View lifecycle -

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let notification = self.shouldDisplayAlertNotification() {
            self.showNotification(notification)
        }
    }

    // MARK: - Internal methods -

    func shouldDisplayAlertNotification() -> AlertNotification? {
        return nil
    }

    // MARK: - Private methods -

    private func showNotification(_ alertNotification: AlertNotification) {
    }

}

class MyController: GenericViewController {

    override func shouldDisplayAlertNotification() -> AlertNotification? {
        return AlertNotification(title: "Title", message: "Message")
    }

}

其中 AlertNotification 是您的自定义模型 class:

class AlertNotification {
    var title: String
    var message: String

    init(title: String, message: String) {
        self.title = title
        self.message = message
    }
}

这样,只有覆盖shouldDisplayAlertNotification的VC会显示警报。

2。如果您想在 'demand' 上显示警报:

按照建议,扩展 UIViewController

extension UIViewController {
    func showNotification(title: String, message: String) {
    }
}

您还可以在您的应用程序中创建一个 util 文件,因为您可以添加任何可重用的方法或函数并在您的应用程序中的任何地方使用它,例如,

导入基金会 导入 UIKit

//标记:- 警报

func showMessage(title: String, message: String!, VC: UIViewController) {

let alert : UIAlertController = UIAlertController(title: "", message: message, preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) {
    UIAlertAction in
}
alert.addAction(okAction)
VC.present(alert, animated: true, completion: nil)

}

您可以为 alertController 创建扩展,还可以选择操作处理程序。这将允许根据是否需要处理程序使用两个不同的警报控制器。

extension  UIAlertControler {

class func genericErrorAlert(forAlert message: String, completion: ((UIAlertAction) -> Void)? = nil )

    let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: completion))

    return alert
  }
}

您可以使用此视图控制器扩展在整个应用程序中显示警报视图。 https://github.com/SumitKr88/UIViewController-ShowAlertView/blob/master/UIViewController%2BExtensions.swift

extension UIViewController {

/// Show alert view
/// - Parameter title: title of alert
/// - Parameter message: message of alert
/// - Parameter actionTitles: List of action button titles(ex : "OK","Cancel" etc)
/// - Parameter style: Style of the buttons
/// - Parameter actions: actions repective to each actionTitles
/// - Parameter preferredActionIndex: Index of the button that need to be shown in bold. If nil is passed then it takes cancel as default button.

/**
 Example usage:-
 Just make sure actionTitles and actions array the same count.

 /********** 1. Pass nil if you don't need any action handler closure. **************/
 self.showAlert(title: "Title", message: "message", actionTitles: ["OK"], style: [.deafult], actions: [nil])

 /*********** 2. Alert view with one action **************/

 ///     let okActionHandler: ((UIAlertAction) -> Void) = {(action) in
 //Perform action of Ok here
 }
 self.showAlert(title: "Title", message: "message", actionTitles: ["OK", "CANCEL"], style: [.default, .cancel], actions: [okayActionHandler, nil])

 /********** 3.Alert view with two actions **************/

 let okActionHandler: ((UIAlertAction) -> Void) = {(action) in
 //Perform action of ok here
 }

 let cancelActionHandler: ((UIAlertAction) -> Void) = {(action) in
 //Perform action of cancel here
 }

 self.showAlert(title: "Title", message: "message", actionTitles: ["OK", "CANCEL"], style: [.default, .cancel], actions: [okActionHandler,cancelActionHandler], preferredActionIndex: 1)
 */

public func showAlert(title: String?,
                      message: String?,
                      actionTitles: [String?],
                      style: [UIAlertAction.Style],
                      actions: [((UIAlertAction) -> Void)?],
                      preferredActionIndex: Int? = nil) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    for (index, title) in actionTitles.enumerated() {
        let action = UIAlertAction(title: title, style: style[index], handler: actions[index])
        alert.addAction(action)
    }
    if let preferredActionIndex = preferredActionIndex { alert.preferredAction = alert.actions[preferredActionIndex] }
    self.present(alert, animated: true, completion: nil)
}}