Para crear una nueva UIWindow sobre la window principal

En mi aplicación, quiero crear una nueva UIWindow sobre la UIWindow principal, y escribí como sigue, pero no funciona. Primero, creo una UIWindow como la window principal, y luego la hago key y visible, y luego creo una nueva superposition de UIWindow , pero no pasa nada.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor networkingColor]; ViewController *vc = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil]; self.window.rootViewController = vc; [self.window makeKeyAndVisible]; UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 320)]; window1.backgroundColor = [UIColor networkingColor]; window1.windowLevel = UIWindowLevelAlert; [window1 makeKeyAndVisible]; return YES; } 

  UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 320)]; window1.backgroundColor = [UIColor networkingColor]; window1.windowLevel = UIWindowLevelAlert; [window1 makeKeyAndVisible]; 

Finalmente sé por qué no funciona, porque window1 es un método var, y se perderá después del método ejecutado. Así que declaro una nueva @property para ello, como

 @property (strong, nonatomic) UIWindow *window2; 

y cambia el código como

  UIWindow *window2 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 80, 320, 320)]; window2.backgroundColor = [UIColor networkingColor]; window2.windowLevel = UIWindowLevelAlert; self.window2 = window2; [window2 makeKeyAndVisible]; 

¡funciona!

Su object window1 es una variable local, cuando el código se agota de este método, este object ya no existe. Cualquier object UIWindow que creamos se agregará a la [[UIApplication shanetworkingApplication] windows] , pero este set solo tiene una reference de semana a cualquier object UIWindow , por lo que depende de su propio código mantener el object de window existente. ¿Por qué Apple logró esto? , Supongo, es que el object [UIApplication shanetworkingApplication] existe mientras la aplicación se ejecute, para evitar que los objects UIWindow solo existan durante un time en la memory "para siempre".

Además, su código podría ejecutarse con MRC.

Xcode 8 + Swift

 class ViewController: UIViewController { var coveringWindow: UIWindow? func coverEverything() { coveringWindow = UIWindow(frame: (view.window?.frame)!) if let coveringWindow = coveringWindow { coveringWindow.windowLevel = UIWindowLevelAlert + 1 coveringWindow.isHidden = false } } } 

De acuerdo con la documentation , para recibir events que no tienen un valor de coorderadas relevante, como la input del keyboard, ¡háganla key lugar de simplemente ! isHidden :

 coveringWindow.makeKeyAndVisible() 

Incluso puede controlar la transparencia de su background, para un efecto de humo:

 coveringWindow.backgroundColor = UIColor(white: 0, alpha: 0.5) 

Tenga en count que dicha window debe manejar los cambios de orientación.

intente agregar una UIView en mainWindow no otra UIWindow como …

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor networkingColor]; ViewController *vc = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil]; self.window.rootViewController = vc; [self.window makeKeyAndVisible]; UIView * viewAlert = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)]; viewAlert.backgroundColor = [UIColor networkingColor]; [self.window.rootViewController.view addSubView:viewAlert]; /* or you can use following.. [self.window addSubView:viewAlert]; */ [viewAlert release]; //FOR NON ARC return YES; } 

En UIWindow se puede agregar una nueva UIWindow siguiente manera …

 class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var viewController: ViewController? var navigationController: UINavigationController? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.viewController = ViewController(nibName: "ViewController", bundle:NSBundle.mainBundle()) self.navigationController = UINavigationController(rootViewController: self.viewController!) self.window!.rootViewController = self.navigationController // self.window!.addSubview(self.viewController!.view) self.window!.makeKeyAndVisible() return true } //Other methods.. }