UIWindow小结

2020-07-01  本文已影响0人  小沛2016

何为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。

上一篇 下一篇

猜你喜欢

热点阅读