获取应用程序的主窗口

38

UIApplication有一个方法keyWindow, 但是如果一个警告框(alert view)正在显示,则它会返回警告框的窗口,而不是应用程序的主窗口。

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


你能否更详细地说明你正在尝试什么? - Nitin Gohel
请看这个问题,可能会对你有帮助:https://dev59.com/xlzUa4cB1Zd3GeqP34N- - Nitin Gohel
8个回答

59

UIApplicationDelegate 通常有一个指向 "main window" 的引用:

[[[UIApplication sharedApplication] delegate] window];

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

请参见UIApplication类参考


3
这对代表来说是可选的,不是吗?我希望有一种更“具体”的方式。 - Jonathan.
[[[UIApplication sharedApplication] delegate] window]——正常运行。 - Basem Saadawy

12

我不完全确定这对每种情况都奏效,但这应该可以起作用:

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

窗口是按照前后顺序排列的,因此主窗口应始终位于索引0。


12
如果没有窗口(虽然几乎不可能出现这种情况),为了避免出现越界异常,你应该调用[[[UIApplication sharedApplication] windows] firstObject]。这是一个好习惯,可以避免这种情况的发生。 - michaellindahl
即使有12个人同意,我也不能说“即使我们不知道它是如何工作的,检查某些东西是一个好习惯”。即使你写了:“不像永远不会有任何窗口”,在这里最好的选择是明确地写出:“我确定有一个窗口索引0”。这将导致边界异常。这很棒!你不能用Michael建议的策略赢得胜利——这将导致这些必要的检查混乱。谁知道以后我们是否需要它们。 - Vlad Servitola

7

以下是Swift 3.0版本的rmaddy答案

let window = UIApplication.shared.windows.first

我还应该补充一点,在iOS 8.0以后,UIAlertController已经替代了UIAlertView,并且作为一个视图控制器,您可能不再面临创建新窗口的问题。


3

在Swift中:

UIApplication.sharedApplication().delegate?.window

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

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


0

Swift 3

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

他说UIApplication而不是NSApplication,它标记为iOS。 - fpg1503
2
如果我有一美元每次发生相反的情况(人们用Cocoa Touch的答案回答Cocoa问题),我将会是一个富有的人。给Ted松一点吧。 :) - Clifton Labrum

0

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

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

在这个popViewController的viewDidLoad()中,我添加了一个子视图,这导致控制台出现错误和显示错误。因此,我必须找到另一种解决方案来使它正常工作。希望这可以帮助到您。

-2

Swift 3

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

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