1

我想了解 iOS 应用程序中的视图层次结构,所以我使用 XCode 4.6 制作了一个单视图应用程序。它会自动创建一个应用程序委托和一个视图控制器。这是应用程序委托的相关部分:

- (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;
}

因此,它初始化一个窗口,然后设置窗口的根视图控制器。由于 UIWindow 是 UIView,并且 UIView 具有 subviews 属性,因此我希望根视图控制器的视图将是我的应用程序窗口的子视图。所以我在这个根视图控制器的方法中检查了它:

- (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)

我假设主窗口将是视图层次结构中的最顶层视图,并且所有内容都将是它的子视图。然而,根据我的小实验,似乎有这个主窗口和根视图控制器的视图都位于视图层次结构的顶部,它们没有任何子视图/超级视图关系!谁能解释为什么我的根视图控制器的视图不是主窗口的子视图?谢谢

4

1 回答 1

2

你的假设可能是正确的,也可能是错误的。问题是你的测试。

加载视图时,viewDidLoad称为 - 内联。在完成加载之前,无法将视图添加到超级视图,因此在viewDidLoad调用时不可能将其添加到超级视图。

尝试运行您的代码,viewWillAppear:因为您可以合理地预期到那时该视图将具有一个超级视图。

于 2013-06-08T16:56:31.463 回答