23

使用 iOS 7 编译和运行 - 在呈现模式视图控制器时,我收到警告消息:“不鼓励在分离的视图控制器上呈现视图控制器”。我从来没有遇到过 iOS 6 或更早版本的问题。任何人都可以显示在呈现模态视图控制器时是否有任何变化?

SearchViewController *controller1;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController-iPad" bundle:nil];
}
else
{
   controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
}
controller1.delegate = self;
[[self navigationController] presentModalViewController:controller1 animated:YES];

*编辑 *这是代码有人可以指出它的嵌套位置。看起来它们是嵌套的,请建议如何使用子视图控制器模式进行链接。

(void)applicationDidFinishLaunching:(UIApplication *)application
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        self.loginRootviewController =   [[MainViewController alloc] initWithNibName:@"MainViewController-iPad" bundle:nil];
    }
    else
    {
       self.loginRootviewController =   [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    }

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.loginRootviewController];


    DDMenuController *rootController = [[DDMenuController alloc] initWithRootViewController:navController];
    _menuController = rootController;



    AppMainMenuViewController *leftController = [[AppMainMenuViewController alloc] init];
    rootController.leftViewController = leftController;
    self.loginRootviewController.delegateLogin = leftController;

    self.window.rootViewController = rootController;

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

}
4

11 回答 11

18

当我们尝试在不属于 rootViewController 的其他视图控制器中以模态方式呈现视图控制器时,通常会出现此警告,而我们只是 addSubview 视图控制器的视图。

在这个阶段,我们应该在作为 rootViewController 一部分的视图控制器中调用 presentViewController。

所以我们可以直接在rootViewController中呈现任意视图控制器

UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
[vc presentViewController:obj animated:YES completion:nil];
[vc dismissViewControllerAnimated:YES completion:nil];
于 2013-11-30T13:02:15.413 回答
18

如果故事板不知道以任何方式将该视图控制器连接回根视图控制器的任何 segue,则视图控制器将被分离。

建议您通过 Interface Builder 创建一个 segue 并在代码中调用它,即使是模式视图,如果您使用的是故事板。

即使使用 XCode 4.6.x 和 iOS 6.x,您在构建时也会收到有关未附加视图控制器的警告。

如果您有两个故事板(一个用于 iPhone,一个用于 iPad),您可以为每个故事板命名相同的 segue。Segue 标识符只需要在每个情节提要中唯一。因此,执行具有相同标识符的 segue ( performSegueWithIdentifier ) 可以将您带到 iPhone 上的一个地方和 iPad 上的另一个地方。

于 2013-09-16T19:25:28.107 回答
18

我也有同样的问题,我也没有使用故事板(我正在做一个三年前的项目)。

在我的情况下,原因是我没有将应用程序的 rootViewController 分配给窗口,如下所示:

- (BOOL)application:didFinishLaunchingWithOptions:
{
    ...
    self.window.rootViewController = myRootViewController; // I was missing this
    ...
}

现在没有更多警告了。

于 2013-09-20T11:46:03.600 回答
7

对于那些使用 DDMenuViewController 的人来说,这是一个简单的修复。只需添加[self addChildViewController:controller];initWithRootViewController和 到setRightViewControllersetLeftViewController

于 2013-09-30T20:56:57.700 回答
4

为避免在推送导航中收到警告,您可以直接使用:

[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];

然后在您的模态视图控制器中,当一切都完成后,您可以调用:

[self dismissViewControllerAnimated:YES completion:nil];

于 2014-01-08T18:33:32.380 回答
2

如果您使用情节提要并收到此错误,则可能会在尝试从 viewDidLoad 自动呈现视图时过快发生。如果您在一小段时间后调用模态 segue,它会在没有任何进一步警告的情况下工作。

于 2014-09-23T09:30:30.520 回答
2

当您有嵌套的视图控制器时,仍可能会出现此消息。如果是这种情况,请确保它们使用子视图控制器模式链接。

于 2013-09-20T17:23:30.193 回答
1

调用 [self presentViewController:vc animated:NO completion:nil]; 在 viewDidAppear 中为我解决了这个问题。

于 2014-10-27T13:58:40.523 回答
0

我有同样的问题。但不是我开始视图的方式,而是视图的配置方式。我不小心将视图上的类设置为视图控制器类,而不是文件所有者。线索是它显示了视图,但缺少一些样式。奇怪的是它可以在旧版本的 iOS 上运行。

于 2014-05-14T14:23:20.620 回答
0

我发现,如果您使用情节提要,您需要将呈现新视图控制器的代码放在 viewDidAppear 中。它还将消除“开始/结束外观转换的不平衡调用...”警告。

于 2016-04-07T01:09:17.383 回答
-5

在 iOS 7 下,presentModalViewController 已被弃用。

我已将其替换为

[self.navigationController pushViewController:查看动画:是];

它修复了我遇到的一些错误。

值得一试。

于 2013-10-19T00:50:09.127 回答