如何从情节提要中实例化UIButton类中的视图控制器实例

时间:2019-07-11 05:54:24

标签: ios swift uibutton

我正在尝试从框架中的viewController类访问UIButton的实例。每当从情节提要中实例化button时,就会调用init? (coder aDecoder: NSCoder)。但是我不明白如何从中访问`viewController。

我在init(viewController: UIViewController)类中有一个自定义的初始化方法UIButton,当viewController以编程方式实例化时,它为我提供了button

例如let button = CustomButton(viewController: self)

但是现在我想在viewController通过情节提要(即在button调用时)初始化时获得此init? (coder aDecoder: NSCoder)实例。

直到现在,我正在使用此对象viewController

button.viewController = self

但是我认为这不是获取事物的好习惯。我需要另一种方法。

任何帮助将不胜感激。预先感谢。

3 个答案:

答案 0 :(得分:0)

我认为您可以使用以下代码:

extension UIView {
    func findViewController() -> UIViewController? {
        if let nextResponder = self.next as? UIViewController {
            return nextResponder
        } else if let nextResponder = self.next as? UIView {
            return nextResponder.findViewController()
        } else {
            return nil
        }
    }
}

但是,总的来说,您应该考虑为什么需要它,还有另一种方法可以做到。例如,您可以将委托传递给负责此导航的按钮。

答案 1 :(得分:0)

此属性用于获取任何UIView的ParentViewController(UIViewController)。

extension UIResponder {  

var viewController:UIViewController? {

    if self.next is UIViewController {
        return self.next as? UIViewController
    } else {
        guard self.next != nil else { return nil }
        return self.next?.viewController
    }
}

}

答案 2 :(得分:0)

最后,在我的朋友“ Pankaj Bawane”的帮助下,我得到了这个可行的解决方案。

extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}