UIApplication有一个方法keyWindow
, 但是如果一个警告框(alert view)正在显示,则它会返回警告框的窗口,而不是应用程序的主窗口。
如何获取应用程序的主窗口?
UIApplication有一个方法keyWindow
, 但是如果一个警告框(alert view)正在显示,则它会返回警告框的窗口,而不是应用程序的主窗口。
如何获取应用程序的主窗口?
UIApplicationDelegate
通常有一个指向 "main window" 的引用:
[[[UIApplication sharedApplication] delegate] window];
此外,UIApplication
拥有一个窗口数组 [[UIApplication sharedApplication] windows]
。
请参见UIApplication类参考。
我不完全确定这对每种情况都奏效,但这应该可以起作用:
UIWindow *mainWindow = [UIApplication sharedApplication].windows[0];
窗口是按照前后顺序排列的,因此主窗口应始终位于索引0。
[[[UIApplication sharedApplication] windows] firstObject]
。这是一个好习惯,可以避免这种情况的发生。 - michaellindahl以下是Swift 3.0版本的rmaddy答案:
let window = UIApplication.shared.windows.first
我还应该补充一点,在iOS 8.0以后,UIAlertController
已经替代了UIAlertView
,并且作为一个视图控制器,您可能不再面临创建新窗口的问题。
在Swift中:
UIApplication.sharedApplication().delegate?.window
UIApplication *application = [UIApplication sharedInstance];
NSarray *appWindows = [NSArray arrayWithArray:application.windows];
UIWindow *mainWindow = [appWindows objectAtIndex:0];
我不确定但这可能会有所帮助。
Swift 3
if let window = NSApplication.shared().windows.first {
// you can now modify window attributes
}
UIApplication
而不是NSApplication
,它标记为iOS。 - fpg1503对我来说,我正在展示一个 popViewController
self.presentViewController(popViewController, animated: true, completion: nil)
viewDidLoad()
中,我添加了一个子视图,这导致控制台出现错误和显示错误。因此,我必须找到另一种解决方案来使它正常工作。希望这可以帮助到您。Swift 3
class func sharedInstance() -> AppDelegate{
return UIApplication.shared.delegate as! AppDelegate
}