首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从UIView转到UIViewController?

从UIView转到UIViewController?
EN

Stack Overflow用户
提问于 2009-08-27 11:22:45
回答 22查看 148.1K关注 0票数 192

有没有一种从UIViewUIViewController的内置方法?我知道你可以通过[self view]UIViewController转到它的UIView,但是我想知道是否有反向引用?

EN

回答 22

Stack Overflow用户

发布于 2010-09-17 13:19:21

使用Brock发布的示例,我对其进行了修改,使其成为UIView而不是UIViewController的类别,并使其递归,以便任何子视图都可以(希望)找到父UIViewController。

代码语言:javascript
复制
@interface UIView (FindUIViewController)
- (UIViewController *) firstAvailableUIViewController;
@end

@implementation UIView (FindUIViewController)
- (UIViewController *) firstAvailableUIViewController {
    UIResponder *responder = [self nextResponder];
    while (responder != nil) {
        if ([responder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)responder;
        }
        responder = [responder nextResponder];
    }
    return nil;
}

@end

要使用此代码,请将其添加到一个新的类文件中(我将我的类命名为"UIKitCategories"),并删除类数据……将@接口复制到标题中,并将@实现复制到.m文件中。然后在你的项目中,#import "UIKitCategories.h“并在UIView代码中使用:

代码语言:javascript
复制
// from a UIView subclass... returns nil if UIViewController not available
UIViewController * myController = [self firstAvailableUIViewController];
票数 204
EN

Stack Overflow用户

发布于 2010-04-08 07:07:56

UIViewUIResponder的一个子类。UIResponder通过一个返回nil的实现展示了-nextResponder方法。UIView覆盖了此方法,如UIResponder (出于某种原因而不是在UIView中)中所述:如果视图具有视图控制器,则由-nextResponder返回它。如果没有视图控制器,该方法将返回superview。

将此代码添加到您的项目中,您就可以开始工作了。

代码语言:javascript
复制
@interface UIView (APIFix)
- (UIViewController *)viewController;
@end

@implementation UIView (APIFix)

- (UIViewController *)viewController {
    if ([self.nextResponder isKindOfClass:UIViewController.class])
        return (UIViewController *)self.nextResponder;
    else
        return nil;
}
@end

现在UIView有了返回视图控制器的工作方法。

票数 116
EN

Stack Overflow用户

发布于 2012-01-27 06:56:52

我建议一种更轻量级的方法来遍历完整的响应器链,而不必在UIView上添加类别:

代码语言:javascript
复制
@implementation MyUIViewSubclass

- (UIViewController *)viewController {
    UIResponder *responder = self;
    while (![responder isKindOfClass:[UIViewController class]]) {
        responder = [responder nextResponder];
        if (nil == responder) {
            break;
        }
    }
    return (UIViewController *)responder;
}

@end
票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1340434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档