iOS 7-显示模式视图控制器时收到警告消息

iOS 7-显示模式视图控制器时收到警告消息,ios,objective-c,uiviewcontroller,Ios,Objective C,Uiviewcontroller,使用iOS 7编译和运行-在显示模式视图控制器时,我收到警告消息:“不建议在分离的视图控制器上显示视图控制器”。我从来没有遇到过iOS 6或更早版本的问题。在演示模态视图控制器时,是否有人可以显示任何更改 SearchViewController *controller1; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { controller1 = [[SearchViewController alloc] init

使用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];
*编辑*这是代码,有人可以指出它的嵌套位置。 看起来它们是嵌套的,请建议如何使用子viewcontroller模式链接

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

}

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

建议您通过Interface Builder创建一个segue并在代码中调用它,即使对于模式视图,如果您使用的是情节提要

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


如果你有两个故事板(一个用于iPhone,一个用于iPad),你可以为每个故事板命名相同的序列。每个情节提要的序列标识符必须是唯一的。因此,使用相同的标识符执行segue()可以将您带到iPhone上的一个地方和iPad上的另一个地方。

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

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

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

现在没有更多警告。

当您使用嵌套的ViewController时,此消息仍可能出现。
如果是这种情况,请确保使用子viewcontroller模式链接它们。

对于使用DDMenuViewController的用户,这是一个简单的解决方案。只需添加
[self addChildViewController:controller]
到iOS 7下的
initWithRootViewController
、到
setRightViewController
setLeftViewController
,presentModalViewController不推荐使用

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

}
我把它换成了

[self.navigationController推送视图控制器:视图 动画:是]

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


值得一试。

当我们尝试在其他视图控制器(不属于rootViewController的一部分)中以模式显示视图控制器时,通常会出现此警告,并且我们只是将子视图添加到视图控制器的视图中

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

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

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

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

[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
然后在模态视图控制器中,当一切完成时,您可以调用:



[自解除视图控制器激活:是完成:无]

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

如果您使用的是故事板,并且出现此错误,则在尝试过快地从viewDidLoad自动呈现视图时可能会发生此错误。如果在一小段时间后调用模态序列,它将在没有任何进一步警告的情况下工作。

调用[self-presentViewController:vc animated:NO completion:nil];在ViewDidDisplay中修复了我的问题。

我发现,如果您使用的是故事板,您将需要在ViewDidDisplay中显示新视图控制器的代码。它还将消除“为…开始/结束外观转换的不平衡调用”警告。

顺便说一句,presentModalViewController:animated:已折旧,您应该使用新方法。
presentModalViewController:animated:
已弃用,因为iOS 6.0改用它。不要从导航控制器中显示,而是从中显示“自我“.UIKit会处理这个问题,并会找到谁是最适合展示VC的候选人。如果应用程序没有使用Storyboard,我仍然会在iOS 7 Xcode 5中收到警告。它适用于所有旧版本。我现在可以忽略警告,更大的问题,1。旋转不适用于该视图。2.视图位于状态栏下方。看起来更好的解决方案是将所有XIB转换为故事板,并且不支持任何早于5.0的操作系统。在这一点上做的工作太多了。我正在使用的其他解决方法是pushViewController,而不是presentViewcontroller,并添加自定义动画。@SimonH我正在使用DDMenuViewContorller。两者都有相同的功能。我得到相同的错误,我没有使用故事板。甚至是一个笔尖。我的应用程序有导航控制器,我正在使用presentviewcontroller来显示一些图像,我有这种症状,而且应用程序从未在故事板的一英里之内。获取显示MFMailComposeViewController的消息,其中包含
presentViewController:animated:completion:
presentModalViewController:animated:
。请参见问题主要部分的上文我的代码。看起来它们是嵌套的,请建议如何链接。我同意-根据我对当前标记的正确答案的评论,这并不能修复问题中提到的警告。这一个解决了我的问题。。但如果我们从rootviewcontroller提供一个viewcontroller,会有什么问题吗?太好了,我收到了这个警告,并且在应用程序处于后台时尝试显示启动屏幕时,SLComposeViewController也出现了一些非常奇怪的UI问题。上述操作修复了所有问题。通过我的应用程序和rootViewController获取消息已设置。@HotLicks:可能您正在使用一些嵌套的ViewController。如果是这种情况,任何嵌套的viewController都应该具有parentViewController。如果使用标准容器视图控制器(例如UINavigationC),则此父子关系是自动的