2014-02-11 104 views

回答

6

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

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

即是这种性质window你在appDelegate.h文件中有

  • [[UIApplication sharedApplication] keyWindow];

本属性窗口数组,它是 最近发出的一个UIWindow对象makeKeyAndVisible消息。

iOS中你在appDelegate.m发送makeKeyAndVisible
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
window,这就是我们上面也有,所以它们是相同的。 (这是自动完成,如果你使用故事板)

+0

Downvoted,因为这是不正确的,请参阅杰弗里托马斯和安迪达尔文的答案。 –

32

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

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

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

应该使用哪一个?那么这一切都取决于上下文。

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

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

无论窗口是属于您的应用程序还是属于某个系统窗口,您可能有时想要显示当前正在显示的窗口的视图。我没有遇到过这种情况。

2

最简单的设置是只有一个UIWindow。通常,该窗口将作为应用程序委托的属性保留。 keyWindow是指定接收键盘和其他非触摸相关事件的设备。关键窗口一次只能有一个窗口。因此,如果您添加第二个窗口并将其设置为keyWindow(通过[window makeKeyAndVisible]),您的行将返回不同的窗口!

5

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可能会主导窗口,所以你不能得到你想要的窗口。

相关问题