UIAlertController не работает в модельном классе - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу показать предупреждение. Но я хочу показать это, создав функцию в другом классе и вызвав эту функцию из 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 голосов
/ 29 апреля 2018

Вам необходимо передать ссылку на подкласс UIViewController в свой класс LoginModel, чтобы представить UIAlertViewController в LoginViewController. Вы должны вызвать show alert, как только на экране появится представление LoginViewController, переместить вызов в метод ViewWillApear или viewDidApear

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

в идеале не следует создавать методы, связанные с пользовательским интерфейсом, в классах модели, они должны быть включены в классы UIViewController / UIView или их методы расширения. Классы моделей не должны ничего знать о пользовательском интерфейсе . Таким образом, вы можете легко создать простой метод расширения в UIViewController и вызвать метод showAlert из viewController.

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")
}
0 голосов
/ 29 апреля 2018

В вашем коде есть логическая ошибка. Экземпляр 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)
0 голосов
/ 29 апреля 2018

Напоминание: Ваша модель не должна знать о материалах, связанных с пользовательским интерфейсом. Вместо этого вы должны создать расширение для 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

    })
...