0

iAd の GKTurnBasedMatchmakerViewController と BannerViewController の使用に関連する警告を受け取りました。その警告は次のとおりです。

Presenting view controllers on detached view controllers is discouraged <RootViewController: 0x14cd143c0>

以下に示す一連のコードで、この警告が発生する原因は何ですか?

AppDelegate.h 内

@interface AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow            *window;
RootViewController  *viewController;
}

AppDelegate.m 内

- (void) applicationDidFinishLaunching:(UIApplication*)application {

    viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];

    [window setRootViewController:viewController];
    [window addSubview: viewController.view];
}

次に、ユーザーがホーム画面の [再生] ボタンを押すと、最初に次のようにゲーム センター ビュー コントローラーを開きます (2 行目で、appDelegate で設定された rootViewController と等しい presentingViewController を設定していることに注意してください)。

AppDelegate * theAppDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
self.presentingViewController = theAppDelegate.viewController;
GKTurnBasedMatchmakerViewController *mmvc = [[GKTurnBasedMatchmakerViewController alloc] initWithMatchRequest:request];
[presentingViewController presentViewController: mmvc animated: YES completion:nil];

上記のコードを実行すると、新しいシーンが読み込まれます。このシーンは、私の GameSelectionLayer.h に次のように記述されています。

@interface GameSelectionLayer : CCLayer <InAppStoreControlLayerDelegate> {
    ...
    RootViewController *viewController;
    AppDelegate *app;
    BannerViewController *bannerViewController;
} 

次に、GameSelectionLayer.mm で、次のように bannerViewController onEnter をロードします。

-(void)onEnter {
    [super onEnter];

    app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    viewController = [(AppDelegate *)[[UIApplication sharedApplication] delegate] viewController];

    bannerViewController = [[BannerViewController alloc] initWithContentViewController:viewController];
    app.window.rootViewController = bannerViewController;
}

上記のコードを実行すると、上記の警告が表示されます。この警告の原因となっている私が間違っていると思われることを教えてください。

4

1 に答える 1

1

問題は、別のView Controllerが表示されているView ControllerのView階層を置き換えることです。「切り離された」警告は、ウィンドウにアタッチされていないビュー コントローラーからビュー コントローラーを提示しようとした場合、またはウィンドウにアタッチされた子孫ビュー コントローラーを持たない場合に発生します。

ここでは、2 つのアプローチをお勧めします。ルート ビュー コントローラーを置き換える前にすべてのビュー コントローラーを閉じるか、2 つのオプションのうち良い方として、独自のルート ビュー コントローラー階層を持つ別のウィンドウを使用します。

また、View Controller のビューをウィンドウのサブビューとして追加しないでください。View ControllerをルートView Controllerとして設定すると、システムがそれを行います。

于 2014-07-03T19:26:57.890 に答える