2010-07-29 22 views
23

Bir CGPoint'i UIView'imden UIWindow koordinatlarına dönüştürmek ve UIApplication keyWindow'un her zaman sıfır olduğunu fark ettim; bu neden?UIApplication sharedApplication - keyWindow nil?

UIView'den convertPoint:toView: yöntemini denedim.

Xcode (Görünüm uygulaması) bir şablonda görünüm denetleyicisi denedik bu örnek kod bakın:

- (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"); 
} 

ve ben alıyorum:

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

ben ama sadece dönüştürebilirsiniz Pencereye uygulama temsilcisi aracılığıyla erişiyorum. Ve UIApplication değil. Belgelere göre, keyWindow burada çalışmalıdır, ancak sıfırdır. Bu neden?

cevap

30

Bu kod, uygulama temsilcisinin içinde yer alan [window makeKeyAndVisible];'dan önce gerçekleştirilmiştir. Bu yüzden, keyWindow'un neden nil olduğunu merak etmeyin.

30

kolay yolu yerine uygulama temsilcinize pencereyi elde etmektir:

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

Uygulamanız birden çok pencereye sahipse bu özellik yine de işe yarayacak mı? Örneğin, belge tabanlı bir uygulamada ne var? –

+2

Yani [UIApplication sharedApplication] .keyWindow – Laszlo

+0

@ Laszlo Bu aynı şey değil. Biri, penceresini uygulama temsilcisinden alır; biri şu andan itibaren hangi pencereden olursa olabilir. – iwasrobbed

11

Ben Güdümlü Erişim, [UIApplication sharedApplication] üzerine keyWindow özelliği başlamasının ardından sıfır olarak göründüğünü fark ettim. yaptıktan sonra ilk kez Güdümlü Erişim Modu başlatırken sadece -iOS7 üzerinde başıma

Erişim Güdümlü Ayarlar> Genel> bunu etkin, yani başlangıç ​​GAM görünümü aslında görüntülenen ve by-pass değildir.

Bu Apple API'si buggy gibi görünüyor, aradığım pencereyi almak için aşağıdaki kodu kullanarak çözdüm.

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

yerine belki

[[UIApplication sharedApplication] keyWindow]; 

arasında da iWasRobbed belirttiği gibi

[[[UIApplication sharedApplication] delegate] window]; 

kullanarak deneyebilirsiniz ama rootViewController özelliği bu erişilemiyor olarak benim için çalışma değildi yol.