2013-07-24 133 views
23

UIApplication有一個方法keyWindow,但是如果顯示警報視圖,則返回警報視圖的窗口而不是應用程序的主窗口。獲取應用程序的主窗口

如何獲取應用程序的主窗口?

+0

能否請您更詳細的你有什麼..? –

+0

看看這個問題可能會幫助你: - http://stackoverflow.com/questions/7871241/is-a-mainwindow-xib-truly-needed-in-ios-application –

回答

46

UIApplicationDelegate通常具有的 「主窗口」 的引用:

[[[UIApplication sharedApplication] delegate] window]; 

此外,UIApplication具有窗戶[[UIApplication sharedApplication] windows]的陣列。

查看UIApplication Class Reference

+2

這是可選的代理不是它?我希望能有更具體的方式 –

+0

查看我對我答案的更新。 – Espresso

+0

[[[UIApplication shareApplication]委託]窗口] - 工作正常。 –

8

我不是100%肯定,這部作品在任何情況下,但是這應該工作:

UIWindow *mainWindow = [UIApplication sharedApplication].windows[0]; 

窗口都奉命回到前面,所以主窗口應該始終在索引0

+9

如果沒有窗口,你應該調用'[[[[UIApplication sharedApplication]窗口] firstObject]'以避免出現越界異常(不會有任何窗口,但避免使用這些窗口是一種好習慣) – michaellindahl

+0

@michaellindahl is right – cmp

3
UIApplication *application = [UIApplication sharedInstance]; 
NSarray *appWindows = [NSArray arrayWithArray:application.windows]; 
UIWindow *mainWindow = [appWindows objectAtIndex:0]; 

我不確定,但這可能有幫助。

3

在斯威夫特:

UIApplication.sharedApplication().delegate?.window 
0

對於我來說,我提出一個popViewController

self.presentViewController(popViewController, animated: true, completion: nil) 

,然後在這個popViewController 我添加一個子視圖viewDidLoad(),這將導致錯誤的控制檯和顯示器錯誤。所以我必須找到另一個解決方案來使它工作。希望這可以幫助。

0

斯威夫特3

if let window = NSApplication.shared().windows.first { 
     // you can now modify window attributes 
    } 
+0

他說'UIApplication'不是'NSApplication',它被標記爲iOS – fpg1503

+0

如果我每次都有一美元,反而發生了這種情況(人們用Cocoa Touch的答案回答Cocoa問題),我會變成一個富有的人。 )削減泰德一些鬆懈。 :) –

1

雨燕3.0版本的rmaddy's answer

let window = UIApplication.shared.windows.first 

我還要補充一點,因爲iOS的8.0 UIAlertController已經取代UIAlertView併成爲一個視圖控制器,你可能不再面臨的問題正在創建新窗口。

0

斯威夫特3

class func sharedInstance() -> AppDelegate{ 
     return UIApplication.shared.delegate as! AppDelegate 
    } 
相關問題