委托]窗口]和 .keyWindow之间的区别?

你好我是新手在iPhone开发任何一个可以帮助我知道以下两行之间的区别:

第一:

[[[[UIApplication sharedApplication] delegate] window] addSubview:UIView]; 

第二:

 [[UIApplication sharedApplication].keyWindow addSubview:UIView]; 

提前致谢。

它们在iOS中是相同的,但是在Mac OS上它们可以是不同的,因为在iOS中只有一个窗口,而在Mac OS上可能不止一个。
从文档:
[[[UIApplication sharedApplication] delegate] window];

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

即这是您的appDelegate.h文件中的属性window

  • [[UIApplication sharedApplication] keyWindow];

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

在iOS中,您在您的makeKeyAndVisible里面发送了makeKeyAndVisible
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
window ,这是我们上面的,所以他们是一样的。 (如果您正在使用故事板,则会自动完成)

对于大多数用途,它们将是相同的…但不总是。

[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 。 一次只有一个窗口可能是关键窗口。 所以,如果你添加第二个窗口,并使其成为keyWindow (通过[window makeKeyAndVisible] ),你的线返回不同的窗口!