【问题标题】:Incorrect View Hierarchy: Presenting view controllers on detached view controllers is discouraged不正确的视图层次结构:不鼓励在分离的视图控制器上呈现视图控制器
【发布时间】:2014-07-03 19:19:39
【问题描述】:

我收到了与我使用 GKTurnBasedMatchmakerViewController 和 BannerViewController for iAd 相关的警告。该警告是:

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

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

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

【问题讨论】:

    标签: ios view hierarchy iad rootview


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以,视图控制器对我来说有点神秘。我认为您是在说我的错误出在“onEnter”方法中。您如何建议实施您的第二个选项?使用另一个具有自己的根视图层次结构的窗口是什么意思?
    • 这意味着创建一个新的UIWindow 对象,保留它(这很重要!),将rootViewController 属性设置为要显示的视图控制器,然后调用makeKeyAndVisible 在新窗口中。
    • 在我的问题中显示的“onEnter”方法中,我创建了一个新的 UIWindow 并保留了它。我已将 rootViewController 属性设置为我要显示的视图控制器(即横幅视图控制器),并创建了新窗口 keyAndVisible。这会崩溃,因为我将 rootViewController 设为bannerViewController 的子项。也就是说,我删除了“onEnter”的最后一行,并添加了以下几行:window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [窗口 setRootViewController:bannerViewController]; [窗口 makeKeyAndVisible];
    • 您应该将其添加为子项。你应该让它在自己的窗口上独立。
    • 添加什么作为什么的孩子?同样,我删除了“onEnter”的最后一行并添加了以下行: window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [窗口 setRootViewController:bannerViewController]; [窗口 makeKeyAndVisible];
    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多