How to get UIViewController of a UIView's superview in iOS?

有些话、适合烂在心里 提交于 2019-11-27 18:01:36

You can't access it directly, but you can find the next view controller (if any) by traversing the responder chain.

This is how the Three20 framework does it:

- (UIViewController*)viewController
{
    for (UIView* next = [self superview]; next; next = next.superview)
    {
        UIResponder* nextResponder = [next nextResponder];

        if ([nextResponder isKindOfClass:[UIViewController class]])
        {
            return (UIViewController*)nextResponder;
        }
    }

    return nil;
}

Please note that -webView:decidePolicyForNavigationAction:... is an undocumented method (for iPhoneOS anyway. It's documented for Mac OS X) and the app will likely be rejected if that's for AppStore.


A view controller is not associated with a view. Only reverse applies. To access a view controller, make it a globally accessible variable or property.

If interface builder is used usually one could define an outlet to the application delegate that connects to the navigation view controller. Then you can use

MyAppDelegate* del = [UIApplication sharedApplication].delegate;
[del.the_navigation_view_controller pushViewController:...];

You can get the UIviewController from UIView

UIViewController *viewC = (UIViewController *)view->_viewDelegate;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!