UIApplication sharedApplication - keyWindow是nil?

时间:2010-07-29 04:33:33

标签: iphone objective-c uiapplicationdelegate uiapplication

我想将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

我可以转换它,但只有当我通过app delegate访问窗口时才能转换它。而不是UIApplication。根据文档,keyWindow应该在这里工作,但是没有。 这是为什么?

4 个答案:

答案 0 :(得分:38)

此代码在应用程序委托内[window makeKeyAndVisible];之前执行。 所以,难怪为什么keyWindow还是nil

答案 1 :(得分:34)

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

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

答案 2 :(得分:12)

我注意到在启动Guided Access之后,[UIApplication sharedApplication]上的keyWindow属性似乎为零。

在设置>中启用 时启动指导访问模式后,仅在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属性无法通过这种方式访问​​。

答案 3 :(得分:1)

尝试此操作,首先获取UINavigationController句柄,然后获取topViewController

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

let yourMainViewController = navController.viewControllers.first as! ItemsViewController