// Source: http://stackoverflow.com/a/3732812/1123156 extension UIView { func firstAvailableUIViewController() -> UIViewController? { // convenience function for casting and to "mask" the recursive function return traverseResponderChainForUIViewController() } func traverseResponderChainForUIViewController() -> UIViewController? { if let nextUIViewController = next as? UIViewController { return nextUIViewController } else if let nextUIView = next as? UIView { return nextUIView.traverseResponderChainForUIViewController() } else { return nil } } }