【问题标题】:Get Application's main window获取应用程序的主窗口
【发布时间】:2013-07-24 17:40:43
【问题描述】:

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

如何获取应用的主窗口?

【问题讨论】:

标签: ios objective-c uiwindow uiapplication


【解决方案1】:

UIApplicationDelegate 通常引用“主窗口”:

[[[UIApplication sharedApplication] delegate] window];

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

请参阅UIApplication Class Reference

【讨论】:

  • 这对代表来说是可选的,不是吗?我希望有一种更“具体”的方式
  • [[[UIApplication shareApplication] delegate] window] -- 工作正常。
【解决方案2】:

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

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

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

【讨论】:

  • 如果没有窗口,您应该调用[[[UIApplication sharedApplication] windows] firstObject] 以避免出现越界异常(并非永远不会有任何窗口,但避免这些是一个好习惯
【解决方案3】:

Swift 3.0 版本的rmaddy's answer

let window = UIApplication.shared.windows.first

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

【讨论】:

    【解决方案4】:
    UIApplication *application = [UIApplication sharedInstance];
    NSarray *appWindows = [NSArray arrayWithArray:application.windows];
    UIWindow *mainWindow = [appWindows objectAtIndex:0];
    

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

    【讨论】:

      【解决方案5】:

      在斯威夫特中:

      UIApplication.sharedApplication().delegate?.window
      

      【讨论】:

        【解决方案6】:

        对我来说,我展示的是popViewController

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

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

        【讨论】:

          【解决方案7】:

          斯威夫特 3

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

          【讨论】:

          • 他说的是UIApplication而不是NSApplication,它被标记为iOS
          • 如果每次发生这种情况时我都有一美元(人们用 Cocoa Touch 回答 Cocoa 问题),我会成为一个有钱人。 :) 让泰德松懈一些。 :)
          【解决方案8】:

          斯威夫特 3

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-12
            • 1970-01-01
            相关资源
            最近更新 更多