首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UIApplication.sharedApplication.delegate.window和UIApplication.sharedApplication.keyWindow有什么区别?

UIApplication.sharedApplication.delegate.window和UIApplication.sharedApplication.keyWindow有什么区别?
EN

Stack Overflow用户
提问于 2014-02-11 09:56:47
回答 4查看 25.6K关注 0票数 40

有人能帮我理解以下两行的区别吗?

代码语言:javascript
运行
复制
[UIApplication.sharedApplication.delegate.window addSubview:myView];
代码语言:javascript
运行
复制
[UIApplication.sharedApplication.keyWindow addSubview:myView];
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-11 10:10:32

他们在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

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

在iOS中,您在AppDelegate.m中调用makeKeyAndVisible

application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

您将创建的appDelegate窗口设置为keyWindow。通常情况下,当应用程序放在后台时,银行应用程序会切换关键窗口,以保护用户在家庭按钮双击时的敏感信息,并在应用程序处于前台时切换回主委托窗口。

这个答案是与@SipkeSchoorstra,@D和@andyDarwin合作的。

票数 17
EN

Stack Overflow用户

发布于 2014-02-11 10:08:47

在大多数用途中,它们将是相同的…。但也不总是这样。

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

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

应该用哪一种?这一切都取决于背景。

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

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

可能有一些时候,您希望显示当前正在显示的窗口的视图,而不管该窗口属于您的应用程序还是属于某个系统窗口。我没有遇到过这种情况。

票数 42
EN

Stack Overflow用户

发布于 2017-03-24 09:49:22

Basheer_CAD的答案是不对的。在iOS中,它们并不总是一样的。

杰弗里·托马斯的回答是正确的,让我举一个具体的例子。

代码语言:javascript
运行
复制
- (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);
}

产出如下:

代码语言:javascript
运行
复制
keyWindow --------> (null)
delegate.window --> <ViewController: 0x10030c0e0>
self.view.window -> (null)
keyWindow --------> <UIApplicationRotationFollowingController: 0x100204510>
delegate.window --> <ViewController: 0x10030c0e0>
self.view.window -> <ViewController: 0x10030c0e0>

viewDidLoad时,实际上窗口还没有准备好,所以没有系统窗口。UIAlertView可能控制了窗口,因此您无法获得所需的窗口。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21698482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档