Swift UIAlertController 显示自定义消息

Posted

技术标签:

【中文标题】Swift UIAlertController 显示自定义消息【英文标题】:Swift UIAlertController showing custom message 【发布时间】:2016-06-14 16:40:04 【问题描述】:

我有一个 ViewController 类,其唯一目的是显示一条带有自定义消息和标题的警报消息,该消息通过自定义初始化消息传递。这在视图出现后立即在 viewDidLoad 中完成。然而,我的问题是,当涉及到这个视图时,它会弹出并永远停留在这个视图中,而不是仅仅将视图放在另一个视图之上。我不知道如何解决这个问题。这是我的 alertVC 类的代码

import UIKit

class AlertVC: UIViewController 

  var myMessage: String?
  var myTitle: String?

  override func viewDidLoad() 
    super.viewDidLoad()

    // Do any additional setup after loading the view.
  

  override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  


  override func viewDidAppear(animated: Bool)
    let alertController = UIAlertController(title: myTitle, message: myMessage, preferredStyle: .Alert)
    let OKAction = UIAlertAction(title: "OK", style: .Default) 
        (action: UIAlertAction) in print("Youve pressed OK Button")
    
    alertController.addAction(OKAction)
    self.presentViewController(alertController, animated: true, completion: nil)
  

  convenience init(title: String, message: String)
    self.init()
    self.myTitle = title
    self.myMessage = message
  

这是我如何为此创建对象并尝试显示它的代码。

let alert = AlertVC(title: "Error", message: "error")
presentViewController(alert, animated: true, completion: nil)

感谢任何帮助,如果您需要更多信息,请发表评论。谢谢!

【问题讨论】:

如果AlertVC 的唯一目的是显示UIAlertController,为什么不直接在之前的ViewController 上显示UIAlertController 我试图通过为它创建一种面向对象的方式来创建一种在任何类中使用警报视图的方法。我有大约 5 个可能需要它的类,但我更喜欢抽象的做事方式,而不是每次都硬编码。 您在 viewdidappear() 方法中调用它。在viewdidload() 中调用它。 好吧,我明白了。我已经编辑了我的答案。 :) 请检查这个全局 UIAlertController 扩展:***.com/a/60414319/8201581 【参考方案1】:

为什么不简单地使用extension

extension UIViewController 

  func presentAlert(withTitle title: String, message : String) 
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
    let OKAction = UIAlertAction(title: "OK", style: .default)  action in
        print("You've pressed OK Button")
    
    alertController.addAction(OKAction)
    self.present(alertController, animated: true, completion: nil)
  

并用

调用它
presentAlert(withTitle: "Error", message: "error")

在任何UIViewController 类中

【讨论】:

我把这个扩展放在哪里重要吗?它应该低于我的 AlertVC 类吗?在@vadian 之前我没怎么用过扩展 你可以把它放在文件顶层的任何地方(在任何其他类、结构、枚举之外)。我在一个额外的文件Extensions 中使用了很多扩展 太棒了。好吧,这个很好的解决方案,但如果我想添加 UITextFiled 进行输入。我如何处理文本输入? @ErkamKUCET 请search【参考方案2】:

如果AlertVC 的唯一目的是显示UIAlertController,为什么不直接在之前的ViewController 上显示UIAlertController

所以你在哪里写了这个:

let alert = AlertVC(title: "Error", message: "error")
presentViewController(alert, animated: true, completion: nil)

替换为:

let alertController = UIAlertController(title: myTitle, message: myMessage, preferredStyle: .Alert)
let OKAction = UIAlertAction(title: "OK", style: .Default) 
    (action: UIAlertAction) in print("Youve pressed OK Button")

alertController.addAction(OKAction)
self.presentViewController(alertController, animated: true, completion: nil)

编辑:阅读您的评论后,我了解到您希望避免多次输入相同的代码。我做了一些快速的研究,看来你是shouldn't subclass UIAlertController,所以也许扩展可能有用?比如:

extension UIAlertController
    class func customAlertController(title : String, message : String) -> UIAlertController
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)
        let OKAction = UIAlertAction(title: "OK", style: .Default) 
            (action: UIAlertAction) in print("Youve pressed OK Button")
        
        alertController.addAction(OKAction)
        return alertController
    

然后替换:

let alert = AlertVC(title: "Error", message: "error")
presentViewController(alert, animated: true, completion: nil)

与:

    let alert = UIAlertController.customAlertController("Error!", message: "error")
    self.presentViewController(alert, animated: true) 

    

【讨论】:

感谢您帮助我了解这是怎么回事 :)【参考方案3】:

@vadian 在 Swift 3 中的回答,将完成处理程序添加到警报控制器解除。

extension UIViewController 

    func presentAlertWithTitle(title: String, message : String, onDismiss: SimpleCompletionBlock? = nil)
    
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert)

        let OKAction = UIAlertAction(title: "OK", style: .Default) 
            (action: UIAlertAction) in print("Youve pressed OK Button")

            onDismiss?()
        

        alertController.addAction(OKAction)
        self.presentViewController(alertController, animated: true, completion: nil)
    

【讨论】:

以上是关于Swift UIAlertController 显示自定义消息的主要内容,如果未能解决你的问题,请参考以下文章

swift UIAlertController使用 UIAlertController的宽度 为270

如何在 Swift 中旋转 UIAlertController

Swift:UIAlertController 在 while 循环中

Swift 如何获取 UIAlertController 标题高度

UiAlertView 或 UiAlertController 在 Swift 中仅显示一次

Swift3:在 SKView 中添加 UIAlertController