我的视图控制器StartViewController由另外两个视图控制器(RootViewController或TelnetAddressbookViewController)之一打开/添加(addSubview)。我试图弄清楚这两个中哪一个是启动StartViewController的那个。
NSLog(@"superview %@",self.view.superview.description);
NSLog(@"superview %@",self.superclass);
if ([self.view.superview isKindOfClass:[RootViewController class]]) {
NSLog(@"launched by RootViewController");
}else if ([self.view.superview isKindOfClass:[TelnetAddressbookViewController class]]) {
NSLog(@"launched TelnetAddressbookViewController");
}
[self.view removeFromSuperview];
第一个NSLOG(self.view.superview.description)输出:
superview UIView:0x81d6710; frame =(0 0; 748 1024); transform = [0, 1,-1,0,0,0]; autoresize = RM + BM; layer =>
它的引用是我需要的(0x81d6710),但它的类是UIViewController而不是我的自定义视图控制器。
答案 0 :(得分:4)
而不是
NSLog(@"superview %@",self.view.superview.description);
你想......
#import <objc/runtime.h>
NSLog(@"superview %s",class_getName([self.view.superview class]) );
/* or if you want an NSString */
NSLog(@"superview %@", NSStringFromClass([self.view.superview class]) );
答案 1 :(得分:1)
解开你的问题,我猜你想要两件事中的一件......无论哪种方式,最佳答案似乎都涉及代表...
(1)创建viewController的ViewController
将钩子放回创建视图控制器的最佳方法是在StartViewController
中创建委托属性。然后,无论viewController创建它,都可以将自己设置为委托。然后在StartViewController
中,您将获得所需的参考。
(2)UIViewController的self.view从您所在视图的角度位于视图层次结构的顶层。然后您试图找出UIViewController的子类。
从视图:
self.window.rootViewController
将为您提供当前屏幕内容的顶级viewController。
然后你可以检查它的类,例如
if ([self.window.rootViewController isKindOfClass:[RootViewController class]]) {
NSLog(@"superview RootViewController");
}else if ([self.view.rootViewController isKindOfClass:[TelnetAddressbookViewController class]]) {
NSLog(@"superview TelnetAddressbookViewController");
}
但是这变得非常混乱,因为现在你的视图需要知道两个viewController类,这会破坏MVC。
您最好为视图创建委托,并让各个viewControllers处理委托方法。
顺便说一句,你不应该调用你的一个类“RootViewController”,它会引起混淆,因为它是UIWindow属性的名称。
答案 2 :(得分:0)
如果您搜索视图的控制器,您可能需要这样做:[self.view.superview nextResponder];
答案 3 :(得分:0)
我最终设置了一个属性,它没有回答原始问题(抱歉)。确实应该有一种方法,即使我通过评估超级视图的框架来完成它。