【问题标题】:How to encapsulate an UIViewController (like UIAlertController) in Swift?如何在 Swift 中封装 UIViewController(如 UIAlertController)?
【发布时间】:2017-03-08 15:54:45
【问题描述】:

我的 Storyboard 中有一个 ViewController,它的作用类似于警报(带有标题、消息和两个按钮)。

我想封装它以便能够在我的代码中的任何地方使用它,就像这样:

let alert = CustomAlertViewController(title: "Test", message: "message de test.", view: self.view, delegate: self)
self.present(alert, animated: false, completion: nil)

我的问题是 IBOutlets 没有初始化...

我的 CustomAlertViewController :

public protocol CustomAlertProtocol {
    func alertAccepted()
}

class CustomAlertViewController: UIViewController {

    var delegate :CustomAlertProtocol? = nil
    var parentView :UIView?
    var blurScreenshot :SABlurImageView?

    var alertTitle :String? = nil
    var alertMessage :String? = nil

    @IBOutlet weak var oAlertView: UIView!
    @IBOutlet weak var oAlertTitle: UILabel!
    @IBOutlet weak var oAlertMessage: UILabel!


    //MARK: - Main

    public convenience init(title: String?, message: String?, view: UIView, delegate: CustomAlertProtocol) {
        self.init()
        self.alertTitle = title
        self.alertMessage = message
        self.delegate = delegate
        self.parentView = view
    }

    override func viewDidLoad() {
        oAlertTitle.text = self.alertTitle
        oAlertMessage.text = self.alertMessage
    }

    @IBAction func onAcceptButtonPressed(_ sender: AnyObject) {
        delegate?.alertAccepted()
    }
}

【问题讨论】:

  • 要设置 IBOutlets,您需要从情节提要场景或 nib 文件创建视图控制器。您将需要创建一个执行此操作的类函数,而不是使用 Initializer
  • 我的 ViewController 在我的故事板中,并且 IBOutlets 是链接的。如果我用 storyboard.instantiateViewController 实例化 IBOutlets 被初始化
  • 对。所以创建一个类函数来做这个

标签: ios swift uiviewcontroller delegation


【解决方案1】:

将视图控制器的Custom Class 属性设置为CustomAlertViewController
Storyboard ID 到你想要的任何东西 - 例如CustomAlertViewControllerIdentifier 在 InterfaceBuilder 的身份检查器中。

然后像下面这样实例化它:

let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())

guard let vc = storyboard.instantiateViewControllerWithIdentifier("CustomAlertViewControllerIdentifier") as? CustomAlertViewController else {
    return
}

编辑:

然后您可以将该代码放入类函数中,例如:

extension CustomAlertViewController {
    class func instantiateFromStoryboard(title: String?, message: String?, view: UIView, delegate: CustomAlertProtocol) -> CustomAlertViewController {
        let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
        let vc = storyboard.instantiateViewControllerWithIdentifier("CustomAlertViewControllerIdentifier") as! CustomAlertViewController

        vc.title = title
        vc.message = message
        vc.view = view
        vc.delegate = delegate

        return vc
    }
}

然后使用like:

let myCustomAlertViewController = CustomAlertViewController.instantiateFromStoryboard(title: "bla", ...)

【讨论】:

  • 是的,但我想避免每次我想使用我的 CustomAlertViewController...
  • 我添加了一个示例类函数,如何封装CustomAlertViewController 的视图控制器实例化。我希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多