iOS 7 - 在呈现模态视图控制器时获取警告消息

时间:2013-09-16 19:22:06

标签: ios objective-c uiviewcontroller

使用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];

}

11 个答案:

答案 0 :(得分:18)

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

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

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

如果你有两个故事板(一个用于iPhone,一个用于iPad),你可以为每个设置相同的segue。 Segue标识符每个故事板只需要是唯一的。因此,执行具有相同标识符的segue(performSegueWithIdentifier)可以将您带到iPhone上的一个位置和iPad上的另一个位置。

答案 1 :(得分:18)

我遇到了同样的问题,而且我也没有使用故事板(我正在进行一项为期三年的项目)。

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

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

现在不再发出警告。

答案 2 :(得分:18)

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

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

因此我们可以直接在rootViewController中显示任何视图控制器

UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
[vc presentViewController:obj animated:YES completion:nil];
[vc dismissViewControllerAnimated:YES completion:nil];

答案 3 :(得分:7)

对于那些使用DDMenuViewController的人来说,这是一个简单的解决方法。只需将[self addChildViewController:controller];添加到initWithRootViewController,然后添加到setRightViewControllersetLeftViewController

答案 4 :(得分:4)

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

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

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

[self dismissViewControllerAnimated:YES completion:nil];

答案 5 :(得分:2)

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

答案 6 :(得分:2)

如果您正在使用故事板并收到此错误,则尝试自动从viewDidLoad自动显示视图时可能会发生此错误。如果你在很短的时间之后调用你的模态segue就行了,没有任何进一步的警告。

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我发现,如果您使用的是故事板,则需要在viewDidAppear中放置呈现新视图控制器的代码。它还将摆脱"非平衡调用开始/结束外观转换..."警告。

答案 10 :(得分:-5)

在iOS 7下,不推荐使用presentModalViewController。

我用

替换了它

[self.navigationController pushViewController:View                                      动画:是];

它解决了我遇到的一些错误。

值得一试。