1

我的视图控制器 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) 输出:

超级视图 UIView: 0x81d6710; 帧 = (0 0; 748 1024); 变换 = [0, 1, -1, 0, 0, 0]; 自动调整大小 = RM+BM;层=>

它的引用是我需要的(0x81d6710),但它的类是 UIViewController 而不是我的自定义视图控制器。

4

4 回答 4

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]) );
于 2013-01-31T17:27:28.543 回答
1

如果您搜索视图的控制器,您可能需要这样做:[self.view.superview nextResponder];

于 2013-01-31T17:30:05.187 回答
1

解开你的问题,我想你想要两件事之一......无论哪种方式,最好的答案似乎都涉及一个代表......

(1) 创建视图控制器的视图控制器 将钩子返回到创建视图控制器的最佳方法是在StartViewController. 然后,无论哪个 viewController 创建它都可以将自己设置为委托。然后,StartViewController您将获得所需的参考。

(2) 从你所在的视图的角度来看,self.view 的 UIViewController 位于视图层次结构的顶层。然后你试图找出 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。

您最好为您的视图创建一个委托,并让各自的视图控制器处理委托方法。

顺便说一句,您不应该将您的类之一称为“RootViewController”,因为它是 UIWindow 属性的名称,因此会引起混淆。

于 2013-01-31T17:51:54.683 回答
0

我最终设置了一个属性,它没有回答原始问题(对不起)。确实应该有一种方法,即使我已经通过评估超级视图的框架来做到这一点。

于 2013-02-04T15:55:20.943 回答