如何在iOS中获取UIView的父视图的UIViewController?

24

我有一个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

现在我想获取文本视图的父视图(superview)的viewController,以便在单击URL /电话号码时可以推送另一个viewController。

3个回答

76

你不能直接访问它,但可以通过遍历响应者链来查找下一个视图控制器(如果有的话)。

这就是Three20框架的做法:

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

哇,谢谢。我正在使用Three20,但不知道这个。我总是创建一个委托。对于任何想在Three20中使用它的人,只需导入#import "Three20UICommon/UIView+TTUICommon.h"即可。 - choise
请注意,Three20框架似乎已不再维护。尽管该解决方案仍然有效。 - Josh Bruce

1
请注意,-webView:decidePolicyForNavigationAction:...是一个未记录的方法(至少对于iPhoneOS而言。它在Mac OS X上有记录),如果用于AppStore,该应用程序很可能会被拒绝。

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

如果使用界面构建器,通常可以定义一个插座到应用程序委托,该插座连接到导航视图控制器。然后您可以使用

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

-1

你可以从 UIView 获取 UIviewController。

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

1
viewDelegate是一个私有属性,如果您提交应用到AppStore,则不能使用。 - Sirio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接