Rahul Vyas
Rahul Vyas

Reputation: 28740

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

I have a UIViewController in which I have a UITextView added from interface builder. Now I want to push a view when I click on hyperlink or phone number. I am able to detect that which url is clicked using a method I found in stackoverflow. Here is the method

@interface UITextView (Override)
@end

@class WebView, WebFrame;
@protocol WebPolicyDecisionListener;

@implementation UITextView (Override)

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id < WebPolicyDecisionListener >)listener
{
    NSLog(@"request: %@", request);
}
@end

Now I want to get the viewController of the textview's superview so that I can push another viewController when I click on URL/Phone Number.

Upvotes: 24

Views: 39557

Answers (3)

Prabhjot Singh Gogana
Prabhjot Singh Gogana

Reputation: 1408

You can get the UIviewController from UIView

UIViewController *viewC = (UIViewController *)view->_viewDelegate;

Upvotes: -1

Felixyz
Felixyz

Reputation: 19143

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;
}

Upvotes: 76

kennytm
kennytm

Reputation: 523694

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:...];

Upvotes: 1

Related Questions