35

CGPointをUIViewからUIWindow座標に変換したいのですが、UIApplicationkeyWindowが常にnilであることに気付きました。どうしてこれなの?

convertPoint:toView:UIViewのメソッドを試しました。

Xcode(Viewアプリケーション)のテンプレートのViewControllerで試した次のサンプルコードを参照してください。

- (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はここで機能するはずですが、nilです。どうしてこれなの?

4

4 に答える 4

47

このコードは[window makeKeyAndVisible];、アプリデリゲート内にある前に実行されました。だから、なぜまだkeyWindowだったのも不思議ではnilありません。

于 2010-07-30T14:22:02.700 に答える
38

最も簡単な方法は、代わりにアプリデリゲートからウィンドウを取得することです。

UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window];
// Do something with the window now
于 2013-03-25T20:05:41.590 に答える
16

ガイド付きアクセスを開始した後、[UIApplicationsharedApplication]のkeyWindowプロパティがnilのように見えることに気付きました。

iOS7で、[設定]>[一般]>[ガイド付きアクセス]でガイド付きアクセスモードを有効にした後で初めて起動したときにのみ発生したため、開始GAMビューは実際に表示され、バイパスされません。

このAppleAPIはバグがあるように見えるので、次のコードを使用して、探しているウィンドウを取得することで解決しました。

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

それ以外の

[[UIApplication sharedApplication] keyWindow];

多分あなたも使ってみることができます

[[[UIApplication sharedApplication] delegate] window];

iWasRobbedが指摘したように、この方法ではプロパティに到達できないため、機能しませんでしたrootViewController

于 2014-01-10T11:19:02.620 に答える
1

これを試して、最初にUINavigationControllerハンドルを取得し、次にtopViewControllerを取得します

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

また

let yourMainViewController = navController.viewControllers.first as! ItemsViewController
于 2019-02-05T06:57:11.887 に答える