2015-04-04 48 views
0

那么,其实3,但一个是UITextEffectsWindow为什么我的应用程序中有两个UIWindows,为什么第一个隐藏?

于是,我开始了一个简单的测试应用程序。

的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,所以这是VC实例化并设置为根。但是,那个窗户怎么被标记为隐藏?为什么有两个呢?为什么第二个窗口会作为keyWindow注销?

当我运行应用程序,我居然看到了VC我实例化,并标记为999,但日志说这是不keyWindow,这也是一个隐藏的窗口的一部分。

+1

你是从一个故事板标准的单一视图的应用程序启动?如果是这样,故事板将为您创建一个窗口,并创建另一个窗口。 – rdelmar 2015-04-04 16:14:38

回答

2

的问题是,要创建一个窗口:

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

...但你忘了从停止故事板创建一个窗口!如果您要像这样手动创建窗口,则应删除故事板并设置Info.plist,以便它没有主要故事板设置。你不能既创建一个窗口手动用故事板 - 你已经创建了一个应用程序的结构的内部冲突。

+1

看我为UIApplicationMain如何创建一个窗口_automatically_书,如果有一个故事板:http://www.apeth.com/iOSBook/ch14.html#_the_window – matt 2015-04-04 16:21:59

+0

下面是手动创建的窗口,一个玩具应用的一个例子:HTTPS ://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/iOS7bookExamples/bk2ch01p012frame/ch14p371frame你会发现,它没有情节串连图板和其_Info.plist_没有主要情节串连图板项目。 – matt 2015-04-04 16:29:06

相关问题