何为UIWindow?
个人理解就是app最上层的一个view,手势传递到本APP的始点
获取方法
[[UIApplication sharedApplication]windows].lastObject;
获取最后一个window,但有可能不是当前的window
[[UIApplication sharedApplication] keyWindow];
当前的window (有时候不准,不准的情况下面会说)
[[UIApplication sharedApplication].delegate window];
系统原来的window (appdegete的那个) 不是自己后面加的
特殊情况之获取到的window不准
在某些页面可能会弹出UIAlertView,这时候如果点掉UIAlertView后,在用 [[UIApplication sharedApplication] keyWindow]代码来获取的话,确实获取到的不是当前的window,是系统的
验证
通过下面的几个通知可以尝试验证一波
UIWindowDidBecomeKeyNotification
UIWindowDidResignKeyNotification
UIWindowDidBecomeVisibleNotification
UIWindowDidBecomeHiddenNotification
- (void)initNotification {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowBecomeKey:) name:UIWindowDidBecomeKeyNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowResignKey:) name:UIWindowDidResignKeyNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowBecomeVisible:) name:UIWindowDidBecomeVisibleNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowBecomeHidden:) name:UIWindowDidBecomeHiddenNotification object:nil];
}
- (void)windowBecomeKey:(NSNotification*)noti {
NSArray *windows = [UIApplication sharedApplication].windows;
NSLog(@"count == %ld", windows.count);
NSLog(@"keyWindow == %@",[[UIApplication sharedApplication] keyWindow]);
NSLog(@"keyWindow.p == %p",[[UIApplication sharedApplication] keyWindow]);
}
- (void)windowResignKey:(NSNotification*)noti {
NSArray *windows = [UIApplication sharedApplication].windows;
NSLog(@"count == %ld", windows.count);
NSLog(@"keyWindow == %@",[[UIApplication sharedApplication] keyWindow]);
NSLog(@"keyWindow.p == %p",[[UIApplication sharedApplication] keyWindow]);
}
- (void)windowBecomeVisible:(NSNotification*)noti {
NSArray *windows = [UIApplication sharedApplication].windows;
NSLog(@"count == %ld", windows.count);
NSLog(@"keyWindow == %@",[[UIApplication sharedApplication] keyWindow]);
NSLog(@"keyWindow.p == %p",[[UIApplication sharedApplication] keyWindow]);
}
- (void)windowBecomeHidden:(NSNotification*)noti
{
NSArray *windows = [UIApplication sharedApplication].windows;
NSLog(@"count == %ld", windows.count);
NSLog(@"keyWindow == %@",[[UIApplication sharedApplication] keyWindow]);
NSLog(@"keyWindow.p == %p",[[UIApplication sharedApplication] keyWindow]);
}
如何解决?
在一般的uiview上都有一个window的属性,可以通过这个方法去获取自己想要的window。
网友评论