UIApplication有一个方法keyWindow
,但是如果显示一个警报视图,那么这将返回警报视图的窗口,而不是应用程序的主窗口。
如何获得应用程序的主窗口?
UIApplicationDelegate
通常引用“主窗口”:
[[[UIApplication sharedApplication] delegate] window];
此外,UIApplication
有一系列的窗口[[UIApplication sharedApplication] windows]
。
我不是100%肯定这适用于所有情况但这应该工作:
UIWindow *mainWindow = [UIApplication sharedApplication].windows[0];
窗口按顺序排序,因此主窗口应始终位于索引0处。
Swift 3.0版本的rmaddy's answer:
let window = UIApplication.shared.windows.first
我还应该补充一点,因为iOS 8.0 UIAlertController
已经取代了UIAlertView
并且是一个视图控制器,你可能不再面临创建新窗口的问题。
UIApplication *application = [UIApplication sharedInstance];
NSarray *appWindows = [NSArray arrayWithArray:application.windows];
UIWindow *mainWindow = [appWindows objectAtIndex:0];
我不确定,但这可能会有所帮助。
在Swift中:
UIApplication.sharedApplication().delegate?.window
对我来说,我呈现了一个popViewController
self.presentViewController(popViewController, animated: true, completion: nil)
然后在这个popViewController的viewDidLoad()
中我添加了一个子视图,这会导致控制台中的错误和显示错误。所以我必须找到另一种解决方案才能使它发挥作用。希望这可以帮助。
斯威夫特3
if let window = NSApplication.shared().windows.first {
// you can now modify window attributes
}
斯威夫特3
class func sharedInstance() -> AppDelegate{
return UIApplication.shared.delegate as! AppDelegate
}