【问题标题】:UIWindow not having any subviewsUIWindow 没有任何子视图
【发布时间】:2013-06-04 19:14:52
【问题描述】:

我想了解 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)

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

【问题讨论】:

    标签: iphone ios ipad view hierarchy


    【解决方案1】:

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

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

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

    【讨论】:

    • 哇,感谢您的指点! viewWillAppear 中的输出相同:但是当我从 viewDidAppear 打印结果时,输出是我所期望的:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多