UIAlertController不在模型类中工作

时间:2018-04-29 15:10:16

标签: ios swift uialertcontroller

我想要显示提醒。但我想通过在另一个类中创建一个函数并从viewcontroller调用该函数来显示它。但它不起作用。

以下是我的LoginViewController中的代码:

class LoginViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        LoginModel().show_alert()
    }
}

以下是我的LoginModel代码:

class LoginModel{

    let controller = LoginViewController()

    public func show_alert(){

        let alert = UIAlertController(title: "Title", message: "Some Message", 
        preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: 
       nil))

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

3 个答案:

答案 0 :(得分:0)

提醒:您的模型不应该知道任何与UI相关的内容。相反,你应该创建一个UIViewController的扩展,或创建自由函数

作为免费功能

 func showAlertViewOnto(controller: UIViewController, detailInfo: (title: String?, message: String?), handler: ((UIAlertAction) -> Void)? = nil ) {

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

        alert.addAction(UIAlertAction(title: "Ok", style: .default, handler:
            handler))
        controller.present(alert, animated: true, completion: nil)
    }

作为UIViewController的扩展

extension UIViewController {

     func showAlertView(detailInfo: (title: String?, message: String?), handler: ((UIAlertAction) -> Void)? = nil ) {

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

            alert.addAction(UIAlertAction(title: "Ok", style: .default, handler:
                handler))
            self.present(alert, animated: true, completion: nil)
        }
    }

使用它

  showAlertViewOnto(controller: self, detailInfo: (title: "Hello ", message: "welcome to our service"), handler: { _ in
        // here you can add code once ok is pressed

    })

答案 1 :(得分:0)

您需要将UIViewController子类的引用传递给LoginModel类,以在UIAlertViewController上显示LoginViewController。一旦LoginViewController视图出现在屏幕上,将调用移动到ViewWillApear或viewDidApear方法

,您应该调用show alert
    final class LoginViewController: UIViewController {

        override func viewDidLoad() {
            super.viewDidLoad()
        }

        override func viewDidAppear(_ animated: Bool) {
            super.viewDidApear(animated)
            LoginModel().show_alert(on: self)
        }
    }

    final class LoginModel {

        public func show_alert(on vc: UIViewController) {
             let alert = UIAlertController(title: "Title", message: "Some Message",
                                      preferredStyle: UIAlertControllerStyle.alert)
             alert.addAction(UIAlertAction(title: "Ok", style: .default, handler:
            nil))
            vc.present(alert, animated: true, completion: nil)
       }
   }

理想情况下你不应该在模型类中创建与UI相关的方法,它们应该在UIViewController / UIView类或它们的扩展方法上。模型类不应该对UI内容有任何了解。因此,您可以在UIViewController上轻松创建简单的扩展方法,并从viewController调用showAlert方法。

extension UIViewController {
    func showAlert(_ title: String = "Alert", message: String) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "Ok", style: .default, handler:
            nil))
        present(alert, animated: true, completion: nil)
    }
} 

您可以从UIViewController调用此方法,如

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    showAlert(message: "This is alert message")
}

答案 2 :(得分:0)

您的代码中存在逻辑错误。 LoginViewController的一个实例已存在(在导航堆栈中或是初始视图控制器),它出现在屏幕上。

您在模型类

中创建了一个新的LoginViewController实例
  

let controller = LoginViewController()

未添加到导航堆栈中,因此您无法在屏幕上看到它。

  

controller.present(alert, animated: true, completion: nil)

在新实例上显示UIAlertController不会向用户显示警告,因为此处controller本身不在屏幕上。

您需要从屏幕上可见的实例(最初的实例)中呈现UIAlertController。您可以将函数show_alert更改为以下内容:

class LoginModel{

 func showAlert(forController controller: UIViewController /*you could add title, message and other stuff here if needed.*/){

    let alert = UIAlertController(title: "Title", message: "Some Message", 
    preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: 
   nil))

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

按如下方式修改您的电话:

LoginModel().showAlert(forController: self)