为什么我的应用程序中有两个 UIWindows 而第一个隐藏了?

Why are there two UIWindows in my app and why is the first one hidden?

嗯,其实是3个,不过一个是UITextEffectsWindow.

所以我开始了一个简单的测试应用程序。

AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    ViewController *controller = [[ViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
    self.window.rootViewController = navController;
    [self.window makeKeyAndVisible];
}

在 viewController 我正在标记视图:

    self.view.tag = 999;

当我注销这个

    NSLog(@"[UIApplication sharedApplication].windows = %@",[UIApplication sharedApplication].windows);
    for (UIWindow* window in [UIApplication sharedApplication].windows) {
        NSLog(@"tag = %d",window.rootViewController.view.tag);
    }

我明白了:

2015-04-04 08:59:44.440 SDK[45888:1495552] [UIApplication sharedApplication].windows = (
    "<UIWindow: 0x7fc57371e1e0; frame = (0 0; 375 667); hidden = YES; gestureRecognizers = <NSArray: 0x7fc57371eb10>; layer = <UIWindowLayer: 0x7fc57371c2f0>>",
    "<UIWindow: 0x7fc57352b0d0; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x7fc5750115f0>; layer = <UIWindowLayer: 0x7fc573526f20>>",
    "<UITextEffectsWindow: 0x7fc5750260c0; frame = (0 0; 375 667); opaque = NO; gestureRecognizers = <NSArray: 0x7fc575026fb0>; layer = <UIWindowLayer: 0x7fc575026580>>"
)
2015-04-04 09:03:33.319 SDK[46643:1499077] tag = 999
2015-04-04 09:03:33.319 SDK[46643:1499077] tag = 0
2015-04-04 09:08:11.648 SDKVevo[47379:1501367] key
2015-04-04 09:03:33.319 SDK[46643:1499077] tag = 0

可以看到,有两个UIWindows,第一个是隐藏的。此外,第一个的标签是 999,所以这是我实例化并设置为 root 的 VC。但是为什么 window 被标记为隐藏?为什么首先有两个?为什么第二个 window 作为 keyWindow 注销?

当我 运行 我实际看到 VC 我实例化并标记为 999 的应用程序时,但日志显示它是非键窗口的一部分,它也是一个隐藏的 window.

问题是您正在创建 window:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    ...
}

...但您忘记停止故事板 创建 window!如果你打算像这样手动创建一个 window,你应该删除情节提要并设置 Info.plist,这样它就没有主情节提要设置。您不能同时手动创建window并且使用情节提要-您已经在应用程序的结构中创建了内部冲突。