Ответ 1
Этот код был выполнен до [window makeKeyAndVisible];
, который находится внутри делегата приложения.
Поэтому неудивительно, почему keyWindow
был nil
.
Я хочу преобразовать CGPoint из моих UIView в координаты UIWindow и понял, что ключ UIApplication keyWindow всегда равен нулю; почему это?
Я пробовал метод convertPoint:toView:
из UIView.
Пожалуйста, ознакомьтесь с этим примером кода, который я попробовал в контроллере представления в шаблоне приложения Xcode (View):
- (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 должен работать здесь, но равен нулю. Почему это?
Этот код был выполнен до [window makeKeyAndVisible];
, который находится внутри делегата приложения.
Поэтому неудивительно, почему keyWindow
был nil
.
Самый простой способ - получить окно из делегата приложения:
UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window];
// Do something with the window now
Я заметил, что после запуска управляемого доступа свойство keyWindow в [UIApplication sharedApplication] выглядит нулевым.
Это случилось со мной только на iOS7 при первом запуске режима управляемого доступа после включения его в настройках > Общие > Ведомый доступ, поэтому начальное представление GAM фактически отображается, а не обходит.
Поскольку этот API Apple кажется ошибочным, я решил использовать следующий код, чтобы получить окно, которое я ищу.
NSArray *windows = [[UIApplication sharedApplication] windows];
if ([windows count]) {
return windows[0];
}
return nil;
Вместо
[[UIApplication sharedApplication] keyWindow];
возможно, вы также можете попробовать использовать
[[[UIApplication sharedApplication] delegate] window];
как iWasRobbed указал, но он не работал у меня, поскольку свойство rootViewController
недоступно таким образом.
Попробуйте это, сначала получите дескриптор UINavigationController
, а затем topViewController
let navController = window?.rootViewController as! UINavigationController
let itemsController = navController.viewControllers.first as! ItemsViewController
or
let itemsController = navController.topViewController as! ItemsViewController