我想要显示提醒。但我想通过在另一个类中创建一个函数并从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)
}
}
答案 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方法
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)