[[[[UIApplication sharedApplication]委托]窗口]和[[UIApplication sharedApplication] .keyWindow之间的差异?

tv.*_*vin 37 iphone objective-c ios

您好,我是iPhone开发的新手,任何人都可以帮助我了解以下两行之间的区别:

第一:

[UIApplication.sharedApplication.delegate.window addSubview:myView];
Run Code Online (Sandbox Code Playgroud)

第二:

[UIApplication.sharedApplication.keyWindow addSubview:myView];
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Jef*_*mas 38

对于大多数用途,它们将是相同的......但并非总是如此.

[UIApplication sharedApplication].keyWindow是当前正在设备上显示的窗口.这通常是应用程序的窗口,但可能是系统窗口.

[UIApplication sharedApplication].delegate.window 是您的应用程序应该使用的窗口.

应该使用哪一个?那一切都取决于背景.

如果要更新部分应用程序,则应将视图添加到应用程序窗口.这几乎总是你想要做的.

就个人而言,当我需要直接向窗口添加视图时,我总是使用[[UIApplication sharedApplication].delegate.window addSubview:view][self.view.window addSubView:view](内部UIViewController).

有时您可能希望向当前显示的窗口显示视图,无论该窗口属于您的应用程序还是某个系统窗口.我没有碰到那种情况.


Bas*_*CAD 10

它们在iOS上可能是相同的.当它们不同时,通常会呈现除应用代表主窗口之外的另一个窗口.您的应用程序可以有多个窗口,但只有keyWindow窗口中可见的窗口和接收事件(例如可见UIAlert,接收事件是关键窗口)参考:https://developer.apple.com/library /content/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

来自文档:
- 为UIApplication.sharedApplication.delegate.window

演示故事板时使用的窗口.此属性包含用于在设备主屏幕上显示应用程序可视内容的窗口.

即这是windowAppDelegate.h文件中的属性

  • 对于 UIApplication.sharedApplication.keyWindow

此属性将UIWindow对象保存在最近发送makeKeyAndVisible消息的windows数组中.

在iOS上你发送makeKeyAndVisible了你的AppDelegate.m内部
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

您将创建的appDelegate窗口设为keyWindow.通常银行应用程序在应用程序放在后台时切换关键窗口,以便在主页按钮被双击时保护用户敏感信息,并在应用程序处于前台时切换回主代理窗口.
这个答案与:@SipkeSchoorstra,@ D-Mx和@andyDarwin合作


And*_*win 6

Basheer_CAD的答案不对.它们在iOS中并不总是相同的.

Jeffery Thomas的回答是正确的,让我提供一个具体的例子.

- (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);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

keyWindow --------> (null)
delegate.window --> <ViewController: 0x10030c0e0>
self.view.window -> (null)
keyWindow --------> <UIApplicationRotationFollowingController: 0x100204510>
delegate.window --> <ViewController: 0x10030c0e0>
self.view.window -> <ViewController: 0x10030c0e0>
Run Code Online (Sandbox Code Playgroud)

viewDidLoad实际上,当窗口尚未就绪时,系统窗口没有任何内容.UIAlertView可能会占据窗口,所以你无法获得你想要的窗口.