36

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

如何获取应用程序的主窗口?

4

8 回答 8

60

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

[[[UIApplication sharedApplication] delegate] window];

此外,UIApplication还有一系列 windows [[UIApplication sharedApplication] windows]

请参阅UIApplication 类参考

于 2013-07-24T17:43:42.380 回答
11

我不是 100% 确定这在每种情况下都有效,但这应该有效:

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

窗口从后到前排列,因此主窗口应始终位于索引 0 处。

于 2013-07-24T17:47:07.140 回答
7

rmaddy 的Swift 3.0 版本的回答:

let window = UIApplication.shared.windows.first

我还应该补充一点,由于 iOS 8.0UIAlertController已取代UIAlertView并成为视图控制器,您可能不再面临创建新窗口的问题。

于 2016-12-27T22:53:36.293 回答
3
UIApplication *application = [UIApplication sharedInstance];
NSarray *appWindows = [NSArray arrayWithArray:application.windows];
UIWindow *mainWindow = [appWindows objectAtIndex:0];

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

于 2013-07-24T18:03:27.893 回答
3

在斯威夫特:

UIApplication.sharedApplication().delegate?.window
于 2016-04-29T19:44:29.070 回答
0

斯威夫特 3

    if let window = NSApplication.shared().windows.first {
        // you can now modify window attributes
    }
于 2016-12-27T22:47:42.690 回答
0

对我来说,我正在展示一个popViewController

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

然后在viewDidLoad()这个 popViewController 中我添加了一个 subview,这会导致控制台中的错误和显示错误。所以我必须找到另一种解决方案来让它发挥作用。希望这可以帮助。

于 2016-05-20T09:53:22.970 回答
-2

斯威夫特 3

class func sharedInstance() -> AppDelegate{
        return UIApplication.shared.delegate as! AppDelegate
    }
于 2017-03-31T11:20:41.397 回答