2015-04-04 1 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 I создается и устанавливается как root. Но как получилось, что это окно отмечено как скрытое? И почему в первую очередь есть два? И почему второе окно выходит из строя как keyWindow?

Когда я запускаю приложение, я на самом деле вижу экземпляр VC I и помечен как 999, но журналы говорят, что это часть не-KeyWindow, которая также является скрытым окном.

+1

Вы начинаете со стандартного приложения с одним видом с помощью раскадровки? Если это так, раскадровка создает для вас одно окно, и вы создаете другое. – rdelmar

ответ

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

+0

Вот пример игрушечного приложения, которое создает его окно вручную: https : //github.com/mattneub/Programming-iOS-Book-Examples/tree/master/iOS7bookExamples/bk2ch01p012frame/ch14p371frame. Вы заметите, что у него нет раскадровки и что у его _Info.plist_ нет основной записи вставки. – matt

Смежные вопросы