我收到的警告与我使用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;
}
上述代码运行时,我收到上述警告。请让我知道你认为我可能做错了什么导致了这个警告。
答案 0 :(得分:1)
问题是您正在替换视图控制器的视图层次结构,该视图控制器具有另一个视图控制器。 &#34;分离&#34;当您尝试从未附加到窗口的视图控制器呈现视图控制器,或者没有附加到窗口的后代视图控制器时,会出现警告。
我建议采用两种方法。在替换根视图控制器之前关闭所有视图控制器,或者,两个选项中较好的一个,使用另一个具有自己的根视图控制器层次结构的窗口。
另请注意,您不应将视图控制器的视图添加为窗口的子视图。将视图控制器设置为根视图控制器时,系统会为您执行此操作。