Benjamin RD
Benjamin RD

Reputation: 12034

Get ViewController from inherited UIView class

If I have this extension:

extension UIResponder {
    var parentViewController: UIViewController? {
        return (self.next as? UIViewController) ?? self.next?.parentViewController
    }
}

And this one:

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

If I have a class like this:

class MyClass: UIView {

    init() {
        print("\( parentViewController == nil  )")
        print("\( getParentViewController == nil  )")
    }
}

Both results are null.

How I can get the implemented ViewController from my UIView without pass it as parameter (directly from the view)?

Upvotes: 1

Views: 93

Answers (1)

rob mayoff
rob mayoff

Reputation: 385590

You can’t get the view’s next responder in its init because it hasn’t been set yet. An appropriate time would be in didMoveToWindow.

Also, in your own answer, you said “…is the easier way to get the uiviewcontroller”, as if an app has only one instance of UIViewController, but every non-trivial app has multiple view controllers.

Upvotes: 1

Related Questions