2014-02-11 103 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可能會主導窗口,所以你不能得到你想要的窗口。

相關問題