UIView. How Do I Find the Root SuperView Fast?

If your app only has one UIWindow (usually true), and if that window's only subview is your root controller's view (also usually true):

[randomChildView.window.subviews objectAtIndex:0]

Or you could recursively climb out of the hierarchy, by checking view.superview until you find a view whose superview is nil.


I like this one.

extension UIView {
    func rootView() -> UIView {
        return superview?.rootView() ?? superview ?? self
    }
}

Fast solution (fast as in minimalist):

extension UIView {
    var rootView: UIView {
        superview?.rootView ?? self
    }
}

It's an insignificant amount of processor time to go straight up the superview hierarchy. I have this in my UIView category.

- (UIView *)rootView {
    UIView *view = self;
    while (view.superview != Nil) {
        view = view.superview;
    }
    return view;
}

swift3/4:

func rootSuperView() -> UIView
{
    var view = self
    while let s = view.superview {
        view = s
    }
    return view
}