为什么我的应用程序中有两个 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并且使用情节提要-您已经在应用程序的结构中创建了内部冲突。
嗯,其实是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并且使用情节提要-您已经在应用程序的结构中创建了内部冲突。