2013-07-24 103 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 
    } 
相关问题