Может кто-нибудь помочь мне понять разницу между следующими двумя строками:
[UIApplication.sharedApplication.delegate.window addSubview:myView];
[UIApplication.sharedApplication.keyWindow addSubview:myView];
Может кто-нибудь помочь мне понять разницу между следующими двумя строками:
[UIApplication.sharedApplication.delegate.window addSubview:myView];
[UIApplication.sharedApplication.keyWindow addSubview:myView];
Они могут быть одинаковыми на iOS. Когда они отличаются, обычно вы представляете другое окно, кроме основного окна делегата приложения. В вашем приложении может быть много окон, но только keyWindow - это окно, которое видно на экране и получает события (например, UIAlert, когда он виден, а получение событий - это ключевое окно): https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html
из документации:
UIApplication.sharedApplication.delegate.window:Окно для использования при представлении раскадровки. Это свойство содержит окно, используемое для представления визуального контента приложений на устройствах главный экран.
то есть это свойство window, которое имеется в вашем файле AppDelegate.h.
UIApplication.sharedApplication.keyWindow:Это свойство содержит объект UIWindow в массиве windows, который Совсем недавно было отправлено сообщение makeKeyAndVisible.
На iOS вы вызываете makeKeyAndVisible в вашем AppDelegate.m внутри
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Вы сделали созданное окно appDelegate keyWindow. Обычно банковские приложения переключают ключевое окно, когда приложение помещается в фоновом режиме, чтобы защитить конфиденциальную информацию пользователей, когда дважды нажимается кнопка "Домой", и переключаться обратно в главное окно делегата, когда приложение находится на переднем плане.
Этот ответ находится в сотрудничестве с: @SipkeSchoorstra, @D-Mx и @andyDarwin
Для большинства применений они будут одинаковыми... но не всегда.
[UIApplication sharedApplication].keyWindow - это окно, которое в настоящее время отображается на устройстве. Обычно это окно приложения, но может быть системным окном.
[UIApplication sharedApplication].delegate.window - это окно, в котором предполагается использовать ваше приложение.
Какой из них следует использовать? Хорошо, что все зависит от контекста.
Если вы обновляете часть своего приложения, вы должны добавить представления в окно своего приложения. Это почти всегда то, что вы хотите сделать.
Лично я всегда использую [[UIApplication sharedApplication].delegate.window addSubview:view] или [self.view.window addSubView:view] (внутри UIViewController), когда мне нужно добавить представление непосредственно в окно.
Может быть несколько раз, когда вы хотите представить представление для отображаемого в настоящее время окна, независимо от того, принадлежит ли это окну вашему приложению или какое-то системное окно. Я не сталкивался с этой ситуацией.
Ответ Basheer_CAD неверен. Они не всегда одинаковы в iOS.
Ответ Джеффри Томас правильный, и позвольте мне привести конкретный пример.
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"keyWindow --------> %@",[UIApplication sharedApplication].keyWindow.rootViewController);
NSLog(@"delegate.window --> %@",[UIApplication sharedApplication].delegate.window.rootViewController);
NSLog(@"self.view.window -> %@",self.view.window.rootViewController);
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"message" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:nil];
[alert show];
NSLog(@"keyWindow --------> %@",[UIApplication sharedApplication].keyWindow.rootViewController);
NSLog(@"delegate.window --> %@",[UIApplication sharedApplication].delegate.window.rootViewController);
NSLog(@"self.view.window -> %@",self.view.window.rootViewController);
}
Вывод:
keyWindow --------> (null)
delegate.window --> <ViewController: 0x10030c0e0>
self.view.window -> (null)
keyWindow --------> <UIApplicationRotationFollowingController: 0x100204510>
delegate.window --> <ViewController: 0x10030c0e0>
self.view.window -> <ViewController: 0x10030c0e0>
Когда viewDidLoad, на самом деле окно еще не готово, поэтому для системного окна ничего нет. UIAlertView может доминировать над окном, поэтому вы не можете получить нужное окно.
Простейшей настройкой является просто один UIWindow. Обычно это окно хранится как свойство в вашем делете приложения. keyWindow - это тот, который предназначен для приема клавиатуры и других событий, не связанных с касанием. Ключевым окном может быть только одно окно за раз. Поэтому, если вы добавите второе окно и сделаете его keyWindow (через [window makeKeyAndVisible]), ваши строки возвратят разные окна!