视图层次结构不正确:不建议在分离的视图控制器上显示视图控制器

时间:2014-07-03 19:19:40

标签: ios view hierarchy iad rootview

我收到的警告与我使用GKTurnBasedMatchmakerViewController和适用于iAd的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];
}

然后,当用户按下主屏幕上的播放按钮时,我首先打开游戏中心视图控制器,如下所示(注意第二行是设置presentationViewController等于在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;
}

上述代码运行时,我收到上述警告。请让我知道你认为我可能做错了什么导致了这个警告。

1 个答案:

答案 0 :(得分:1)

问题是您正在替换视图控制器的视图层次结构,该视图控制器具有另一个视图控制器。 &#34;分离&#34;当您尝试从未附加到窗口的视图控制器呈现视图控制器,或者没有附加到窗口的后代视图控制器时,会出现警告。

我建议采用两种方法。在替换根视图控制器之前关闭所有视图控制器,或者,两个选项中较好的一个,使用另一个具有自己的根视图控制器层次结构的窗口。

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