2010-07-29 141 views
23

我想從我的UIView轉換一個CGPoint到UIWindow座標,並意識到UIApplication keyWindow總是零;爲什麼是這樣?UIApplication sharedApplication - 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應該在這裏工作,但是沒有。 這是爲什麼?

回答

30

此代碼在應用程序委託內部的[window makeKeyAndVisible];之前執行。 因此,難怪爲什麼keyWindow還是nil呢。

30

最簡單的方法是從應用程序的委託,而不是獲取窗口:

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

如果你的應用程序有多個窗口,這仍然有效嗎?喜歡,基於文檔的應用程序呢? – 2013-06-18 18:13:03

+2

你的意思是[UIApplication sharedApplication] .keyWindow – Laszlo 2013-12-11 14:49:31

+0

@Laszlo這不是一回事。一個從應用程序委託中獲得窗口,一個窗口可能位於頂端。 – iwasrobbed 2017-11-08 19:32:41

11

我注意到,在已經開始的引導訪問,在[UIApplication的sharedApplication]的keyWindow屬性似乎是零。

有後開始指導接入模式爲第一時候,它發生在我身上只有iOS7啓用它在設置>通用>的指導下訪問,所以出發GAM視圖實際顯示的,而不是繞過。

由於這個Apple API似乎有bug,我解決了使用下面的代碼來檢索我正在尋找的窗口。

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

而不是

[[UIApplication sharedApplication] keyWindow]; 

也許你也可以嘗試使用

[[[UIApplication sharedApplication] delegate] window]; 

iWasRobbed指出,但它不是爲我工作作爲rootViewController屬性是不可到達此辦法。

相關問題