我想了解 iOS 应用程序中的 View 层次结构,因此我使用 XCode 4.6 制作了一个单一 View 应用程序。它会自动创建一个应用委托(delegate)和一个 View Controller 。这是应用程序委托(delegate)的相关部分:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[MBIViewController alloc] initWithNibName:@"MBIViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
因此,它初始化一个窗口,然后设置窗口的 Root View Controller 。由于 UIWindow 是一个 UIView,并且 UIView 具有 subviews 属性,我预计 Root View Controller 的 View 将是我的应用程序窗口的 subview 。所以我在这个 Root View Controller 的方法中检查了它:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIWindow *currentWindow = [[[UIApplication sharedApplication] delegate] window];
NSLog(@"Subview count of current window: %d", currentWindow.subviews.count);
NSLog(@"Superview of root view controller's view: %@", self.view.superview);
}
奇怪的是输出是:
Subview count of current window: 0
Superview of root view controller's view: (null)
我假设主窗口将是 View 层次结构中最顶层的 View ,所有内容都是它的 subview 。然而,根据我的小实验,似乎有这个主窗口和 Root View Controller 的 View 都位于 View 层次结构的顶部,它们没有任何 subview /父 View 关系!谁能解释为什么我的 Root View Controller 的 View 不是主窗口的 subview ?谢谢
最佳答案
你的假设可能是对的,也可能是错的。问题出在你的测试上。
加载 View 时,内联调用 viewDidLoad
。 View 在完成加载之前无法添加到父 View ,因此在调用 viewDidLoad
时不可能将其添加到父 View 。
尝试在 viewWillAppear:
中运行您的代码,因为您可以合理地预期届时 View 将具有父 View 。
关于iphone - UIWindow 没有任何 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17001742/