有没有一种从UIView到UIViewController的内置方法?我知道你可以通过[self view]从UIViewController转到它的UIView,但是我想知道是否有反向引用?
发布于 2010-09-17 13:19:21
使用Brock发布的示例,我对其进行了修改,使其成为UIView而不是UIViewController的类别,并使其递归,以便任何子视图都可以(希望)找到父UIViewController。
@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代码中使用:
// from a UIView subclass... returns nil if UIViewController not available
UIViewController * myController = [self firstAvailableUIViewController];发布于 2010-04-08 07:07:56
UIView是UIResponder的一个子类。UIResponder通过一个返回nil的实现展示了-nextResponder方法。UIView覆盖了此方法,如UIResponder (出于某种原因而不是在UIView中)中所述:如果视图具有视图控制器,则由-nextResponder返回它。如果没有视图控制器,该方法将返回superview。
将此代码添加到您的项目中,您就可以开始工作了。
@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有了返回视图控制器的工作方法。
发布于 2012-01-27 06:56:52
我建议一种更轻量级的方法来遍历完整的响应器链,而不必在UIView上添加类别:
@implementation MyUIViewSubclass
- (UIViewController *)viewController {
UIResponder *responder = self;
while (![responder isKindOfClass:[UIViewController class]]) {
responder = [responder nextResponder];
if (nil == responder) {
break;
}
}
return (UIViewController *)responder;
}
@endhttps://stackoverflow.com/questions/1340434
复制相似问题