1// Copyright 2015-present 650 Industries. All rights reserved. 2 3#import "EXDevMenuWindow.h" 4#import "EXDevMenuViewController.h" 5#import "EXDevMenuManager.h" 6 7@interface EXDevMenuWindow () 8 9@property (nonatomic, strong) EXDevMenuViewController *viewController; 10 11@end 12 13@implementation EXDevMenuWindow 14 15#pragma mark - UIWindow 16 17- (instancetype)init 18{ 19 if (self = [super init]) { 20 // Set it just above the LogBox so users can easily access it. 21 // https://github.com/facebook/react-native/blob/0.64-stable/React/CoreModules/RCTLogBoxView.mm#L38 22 self.windowLevel = UIWindowLevelStatusBar; 23 self.backgroundColor = [UIColor clearColor]; 24 self.hidden = YES; 25 } 26 return self; 27} 28 29- (void)makeKeyAndVisible 30{ 31 [super makeKeyAndVisible]; 32 33 // `makeKeyAndVisible` apparently doesn't call `hidden` setter so make sure the root view is attached. 34 [self attachRootViewController]; 35} 36 37- (void)setHidden:(BOOL)hidden 38{ 39 [super setHidden:hidden]; 40 41 // Reset `rootViewController` so it gets appearing/disappearing events that we depend on. 42 if (hidden) { 43 [self detachRootViewController]; 44 } else { 45 [self attachRootViewController]; 46 } 47} 48 49#pragma mark - internal 50 51- (void)attachRootViewController 52{ 53 if (!_viewController) { 54 _viewController = [EXDevMenuViewController new]; 55 } 56 self.rootViewController = _viewController; 57} 58 59- (void)detachRootViewController 60{ 61 self.rootViewController = nil; 62} 63 64@end 65