使用UIApplication如何获取我的UIWindow?

45

我只有一个窗口,我尝试过

UIWindow* mWindow = [[UIApplication sharedApplication] keyWindow];

但是这返回了nil。

我还尝试过:

UIWindow* mWindow = (UIWindow*)[[UIApplication sharedApplication].windows objectAtIndex:0];

但是当我尝试打印时,这引发了异常并导致应用程序关闭。

[[UIApplication sharedApplication].windows count]

它打印了0。

注意:我将此放在我的唯一视图控制器的viewDidLoad方法中,这是一个全新的iPad基于视图的应用程序,因此我没有更改任何内容,只是尝试获取窗口。

请帮助我获取此对象。

6个回答

49

如果您的主窗口是AppDelegate的outlet(这应该是情况),那么您可以简单地使用

MyAppDelegate* myDelegate = (((MyAppDelegate*) [UIApplication sharedApplication].delegate));
[myDelegate.window ...]

42

最简单的方法是从应用程序委托获取窗口:

UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window];
// Do something with the window now

20

在调用[window makeKeyAndVisible]之前,应用程序的主窗口是未设置的。你的UIViewController可能是在此调用之前从一个NIB文件中加载的。这就解释了为什么keyWindow返回为nil。

幸运的是,你的视图控制器不需要通过UIApplication来获取窗口。你可以直接使用以下代码:

UIWindow *mWindow = self.view.window;

6
因为该视图尚未成为视图层次结构的一部分。在viewWillAppear:方法中也是如此。 - tomwhipple

7
[[[UIApplication sharedApplication] windows] objectAtIndex:0]; // You can also check the count of this to make sure, because if there are no windows it will crash.

0

iOS 13+,您应该使用:

if let currentScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
    let window = currentScene.keyWindow {
    // now window contains the active window
}

0

你可以用多种方式来实现这个目标。我喜欢使用以下其中一种。

当你只需要访问一次时,可以使用这种方法。

if let window = UIApplication.shared.windows.first as UIWindow? {
    // Action
}

如果您需要多次访问UIWindow,我建议扩展一个类。我喜欢扩展UIViewController
extension UIViewController {
    /// Returns the UIWindow if available.
    public var window: UIWindow? {
        UIApplication.shared.windows.first as UIWindow?
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接