UIApplication sharedApplication - keyWindow - это ноль? - PullRequest
30 голосов
/ 29 июля 2010

Я хочу преобразовать CGPoint из моего UIView в координаты UIWindow и понял, что UIApplication keyWindow всегда равен nil; почему это?

Я попробовал метод convertPoint:toView: из UIView.

Пожалуйста, посмотрите этот пример кода, который я пробовал в контроллере вида в шаблоне 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 здесь должно работать, но это ноль. Почему это?

Ответы [ 4 ]

40 голосов
/ 30 июля 2010

Этот код был выполнен до [window makeKeyAndVisible];, который находится внутри делегата приложения.Поэтому неудивительно, почему keyWindow был nil.

34 голосов
/ 26 марта 2013

Самый простой способ - получить окно от делегата приложения:

UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window];
// Do something with the window now
12 голосов
/ 10 января 2014

Я заметил, что после запуска управляемого доступа свойство keyWindow в [UIApplication sharedApplication] выглядит как ноль.

Это случилось со мной только в 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 недоступно таким образом.

1 голос
/ 05 февраля 2019

Попробуйте, сначала получите дескриптор UINavigationController, а затем topViewController

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

или

let yourMainViewController = navController.viewControllers.first as! ItemsViewController
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...