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];
}

然后当用户在我的主屏幕上按下 Play 按钮时,我首先打开游戏中心视图控制器,如下所示(注意第二行设置 presentingViewController 等于在 appDelegate 中设置的 rootViewController):

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

问题是您正在替换具有另一个视图控制器的视图控制器的视图层次结构。当您尝试从未附加到窗口或没有附加到窗口的后代视图控制器的视图控制器中显示视图控制器时,会出现“分离”警告。

这里我推荐两种方法。要么在替换根视图控制器之前关闭所有视图控制器,要么使用两个选项中更好的一个,使用另一个具有自己的根视图控制器层次结构的窗口。

另外,请注意,您不应将视图控制器的视图添加为窗口的子视图。当您将视图控制器设置为根视图控制器时,系统会为您执行此操作。

于 2014-07-03T19:26:57.890 回答