1

ゲーム センター サポートの実装を開始したばかりの iOS アプリケーションがあります。メイン (ルート) ビュー コントローラーの loadView 中に authenticateWithCompletionHandler メソッドを呼び出します。私のメインビューが表示され、すぐに「ゲームセンターへのサインイン」ダイアログが期待どおりに表示されます。「Create New Account」を選択すると、ゲーム センターの「New Account」ポップアップ ダイアログが画面の中央に表示されます (これは iPad 上にあります)。ポップオーバー ダイアログの下には、単なる黒い画面があります。完了ハンドラーでダイアログを閉じると、期待どおりに消え、メイン メニューが戻ってきます。

これはある種のビュー階層の問題であるに違いないと考えているので、問題を単純化するために新しいプロジェクトを作成しました。Xcode 4.3.2 を使用して、単一のビュー コントローラー クラス「AppViewController」を追加して、新しい「空のアプリケーション」iOS プロジェクトを変更しました。システムで作成された AppDelegate.m ファイルの applicationDidFinishLaunchingWithOptions メソッドを変更して、rootViewController を設定しました (ウィンドウの背景色が白に設定された直後)。

self.window.rootViewController =
    [[[AppViewController alloc] initWithNibName:nil bundle:nil] autorelease];

...そして、AppViewController の loadView メソッドを設定して、色付きの背景を持つビューをロードし (その上に適切に合成されているかどうかを確認できるように)、ゲームキット認証メソッドを呼び出します。

- (void) loadView {
    self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
    self.view.backgroundColor = [UIColor yellowColor];
    GKLocalPlayer * localPlayer = [GKLocalPlayer localPlayer];
    [localPlayer authenticateWithCompletionHandler:nil];
}

この単純な構造は、ビュー階層のセットアップ方法を正確に模倣しています。ビュー階層をロードして管理するウィンドウ rootViewController として設定された単一の UIViewController です。XIB ファイルはありません。

とにかく、この非常に単純なテスト アプリでまったく同じ動作が得られます。[新しいアカウント] ポップオーバー ダイアログが表示されると、下にあるビュー (この場合は黄色の塗りつぶし) が消えます (下にあるウィンドウの白い塗りつぶしが表示されます)。これは、iOS がこれらのコントローラーとビューをどのように管理することを望んでいるかについての私の誤解に関係していると思います。

ただし、(少なくとも私にとって)特に奇妙なのは、「新しいアカウント」ウィンドウをキャンセルするか、既存のアカウントを使用してログインし、すぐに実績のポップオーバー ダイアログを (presentModalViewController を使用して) 表示すると、それが機能することです。 ! 実績ダイアログの後ろにメイン メニュー ビューが表示されます。ビューに単純なボタンを追加し、ビュー コントローラーにボタン プレス ハンドラーを追加すると、同じことが示されました。実績ダイアログには背景ビューが表示されますが、[新しいアカウント] ダイアログは下にあるビューを覆い隠します。明らかに、「新しいアカウント」ダイアログが、下にあるビューの上に浮かんでいるように見えるようにしたいと思います。私はiOS 5.1でテストしていることに言及する必要があります。

あなたが私に与えることができるかもしれない助けをありがとう!

更新:別の stackoverflow 投稿のアドバイスを受けた後、Jeff LaMarche、David Mark、および Jack Nutting による「Beginning iOS 5 Development」を購入し、Xcode の「Empty Application」テンプレートからの開始に関するセクションを確認しました。これにより、テスト コードを少し変更する必要がありました。 「rootViewController」プロパティを直接設定する代わりに、applicationDidFinishLaunchingWithOptions でこれを行っています。

UIViewController * viewController =
    [[[AppViewController alloc] initWithNibName:nil bundle:nil] autorelease];
viewController.view.backgroundColor = [UIColor yellowColor];
[self.window addSubview:viewController.view];

また、View Controller で上記の loadView メソッドを削除しました。これはうまくいきます!誰かが理由を知っていますか?2 つのシステムに実質的な違いは見られません。最初に、ビュー コントローラーでビューを再作成していると思います(2 番目のシステムのビュー コントローラー ビューには alloc/init はありません)。自動的に作成されるビューに何か特別なものはありますか?

UPDATE x2 : OK、本当の違いは次の行にあるようです:

[self.window addSubview:viewController.view];

ウィンドウに rootViewController を設定すると、ウィンドウにビューが自動的に追加されると思いましたが、明示的に行わない限り、この奇妙な動作が発生します。そのため、この問題の回避策を見つけましたが、なぜ機能するのかわかりません。何か案は?ありがとう!

4

1 に答える 1

0

問題の原因はわかりませんが、通常、アプリの起動と同時にauthenticateWithCompletionHandlerメソッドが呼び出されます。appDelegateのapplicationDidFinishLaunchingWithOptionsメソッド内に移動してみて、それが機能するかどうかを確認してください。

于 2012-05-12T06:33:38.383 に答える