获取应用程序的主窗口

UIApplication有一个方法keyWindow ,但是如果显示一个alert视图,那么这将返回警报视图的窗口而不是应用程序的主窗口。

我怎样才能得到应用程序的主窗口?

UIApplicationDelegate通常有一个“主窗口”的引用:

 [[[UIApplication sharedApplication] delegate] window]; 

此外, UIApplication有一个窗口数组[[UIApplication sharedApplication] windows]

请参阅UIApplication类参考 。

我不是100%肯定这在任何情况下,但这应该工作:

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

窗口排在前面,所以主窗口应该始终在索引0处。

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

我不确定,但这可能有帮助。

在Swift中:

 UIApplication.sharedApplication().delegate?.window 

rmaddy的 Swift 3.0版的回答 :

 let window = UIApplication.shared.windows.first 

我还应该补充说,因为iOS 8.0 UIAlertController已经取代了UIAlertView并且作为一个视图控制器,您可能不再面临新build窗口的问题。

对我来说,我提出了一个popViewController

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

然后在这个popViewController的viewDidLoad() 我添加一个子视图 ,这会导致在控制台中的错误和显示错误。 所以我必须find另一个解决scheme来使其工作。 希望这可以帮助。

Swift 3

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

Swift 3

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