找出superview的类名

时间:2013-01-31 17:07:34

标签: ios objective-c

我的视图控制器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而不是我的自定义视图控制器。

4 个答案:

答案 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)

我最终设置了一个属性,它没有回答原始问题(抱歉)。确实应该有一种方法,即使我通过评估超级视图的框架来完成它。