如何在iOS中获得UIView的超级视图的UIViewController?

时间:2010-02-22 08:10:00

标签: ios objective-c uiview uiviewcontroller iphone-sdk-3.0

我有一个UIViewController,其中我从界面构建器添加了一个UITextView。现在,当我点击超链接或电话号码时,我想推送视图。我能够使用stackoverflow中找到的方法检测到哪个url被点击了。这是方法

@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

现在我想获取textview的superview的viewController,这样当我点击URL /电话号码时我就可以推送另一个viewController。

3 个答案:

答案 0 :(得分:76)

您无法直接访问它,但您可以通过遍历响应者链找到下一个视图控制器(如果有)。

这就是the Three20 framework的作用:

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

答案 1 :(得分:1)

请注意-webView:decidePolicyForNavigationAction:...是一种未记录的方法(无论如何都适用于iPhoneOS。它是针对Mac OS X记录的),如果适用于AppStore,应用程序可能会被拒绝。


视图控制器未与视图关联。只有反向适用。要访问视图控制器,请将其设置为全局可访问的变量或属性。

如果使用界面构建器,通常可以定义连接到导航视图控制器的应用程序委托的出口。然后你可以使用

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

答案 2 :(得分:-1)

您可以从UIView获取UIviewController

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