【问题标题】:UIApplication sharedApplication - keyWindow is nil?UIApplication sharedApplication - keyWindow 为零?
【发布时间】:2011-03-22 12:44:23
【问题描述】:

我想将 CGPoint 从我的 UIView 转换为 UIWindow 坐标,并意识到 UIApplication keyWindow 始终为零;这是为什么呢?

我已经尝试了 UIView 中的convertPoint:toView: 方法。

请查看我在 Xcode 模板中的视图控制器中尝试的示例代码(视图应用程序):

- (void)viewDidLoad {
    [super viewDidLoad];
    UIView *test =  [[UIView alloc] initWithFrame:CGRectMake(40,40,250,250)];
    [test setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:test];

    CGPoint p = CGPointMake(100, 100);
    CGPoint np;

    np = [test convertPoint:p toView:[[UIApplication sharedApplication] keyWindow]];
    NSLog(@"p:%@ np:%@", NSStringFromCGPoint(p), NSStringFromCGPoint(np));

    AppDelegate *appDel =  (AppDelegate *)[UIApplication sharedApplication].delegate;

    np = [test convertPoint:p toView:[appDel window]];
    NSLog(@"p:%@ np:%@", NSStringFromCGPoint(p), NSStringFromCGPoint(np));

    np = [test convertPoint:p toView:nil];
    NSLog(@"p:%@ np:%@", NSStringFromCGPoint(p), NSStringFromCGPoint(np));

    [test release];

    if(![[UIApplication sharedApplication] keyWindow])
        NSLog(@"window was nil");
}

我得到:

p:{100, 100} np:{100, 100}
p:{100, 100} np:{140, 160}
p:{100, 100} np:{100, 100}
window was nil

我可以转换它,但只有当我通过应用程序委托访问窗口时。而不是 UIApplication。根据文档, keyWindow 应该在这里工作,但为零。 这是为什么呢?

【问题讨论】:

    标签: iphone objective-c uiapplicationdelegate uiapplication


    【解决方案1】:

    此代码在应用委托内的[window makeKeyAndVisible]; 之前执行。 所以,难怪keyWindownil

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果您的应用程序有多个窗口,这仍然有效吗?比如,在基于文档的应用中呢?
      • 你的意思是[UIApplication sharedApplication].keyWindow
      • @Laszlo 这不是一回事。一个从应用程序委托中获取其窗口,一个从当前可能位于顶部的任何窗口中获取。
      【解决方案3】:

      我注意到在启动引导式访问后,[UIApplication sharedApplication] 上的 keyWindow 属性似乎为 nil。

      在设置>常规>引导访问中启用引导访问模式后第一次启动引导访问模式时仅在iOS7上发生,因此实际显示的是开始的GAM视图而不是由-通过。

      由于这个 Apple API 看起来有问题,我使用以下代码解决了检索我正在寻找的窗口的问题。

      NSArray *windows = [[UIApplication sharedApplication] windows];
      if ([windows count]) {
          return windows[0];
      }
      return nil;
      

      代替

      [[UIApplication sharedApplication] keyWindow];
      

      也许你也可以尝试使用

      [[[UIApplication sharedApplication] delegate] window];
      

      正如iWasRobbed 指出的那样,但它对我不起作用,因为rootViewController 属性无法通过这种方式访问​​。

      【讨论】:

        【解决方案4】:

        试试这个,先获取UINavigationController句柄,再获取topViewController

        let navController = window?.rootViewController as! UINavigationController
        let yourMainViewController = navController.topViewController as! ItemsViewController
        

        let yourMainViewController = navController.viewControllers.first as! ItemsViewController
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 2014-05-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多