警告:不鼓励在分离的视图控制器上呈现视图控制器

在我的应用程序中,我正在使用导航控制器。 后来在一些视图中,我使用presentViewController来显示放大的图像。 另外我不使用故事板或笔尖。

我只在iOS 7中得到这个错误。 它在iOS 6和更早版本中工作正常:

不鼓励在分离的视图控制器上呈现视图控制器

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

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

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

[self dismissViewControllerAnimated:YES completion:nil];

这个警告的原因是我提出了一个视图控制器,而不是全尺寸视图的小视图。 下面给出的是我的项目的形象。 点击上面的四个选项。 用户导航到不同的childviewcontroller的视图(它工作像tabViewcontroller)。 但是,childviewcontroller包含小尺寸的视图。 所以如果我们从childviewcontroller提供一个视图,它会给出这个警告。

大师详细视图

为了避免这种情况,您可以在childviewcontroller的父级上显示一个视图

  [self.parentViewController presentViewController:viewController animated:YES completion:nil]; 

等待viewDidAppear()

如果您在视图实际出现之前尝试呈现视图控制器,也会出现此错误,例如,在viewWillAppear()或更早版本中呈现视图。 尝试在viewDidAppear()或其内部呈现另一个视图。

在我的情况下,我有一个sampleViewController的视图添加为子视图,然后尝试从sampleViewController的视图(这里是self而不是一个UIViewController实例)展示一个sampleViewController

 [self.view addSubview:sampleViewController.view]; 

正确的方法应该是:

 // make sure the vc has been added as a child view controller as well [self addChildViewController:sampleViewController]; [self.view addSubview:sampleViewController.view]; [sampleViewController didMoveToParentViewController:self]; 

顺便说一句,这也适用于呈现一个表格单元格的情况下,你只需要确保tableview控制器已被添加为子视图控制器。

我认为问题是你没有一个适当的视图控制器层次结构。 设置应用程序的rootviewcontroller,然后通过推送或呈现新的视图控制器来显示新的视图。 让每个视图控制器pipe理他们的视图。 只有容器视图控制器(如tabbarviewcontroller)应该将其他视图控制器视图添加到其自己的视图中。 阅读视图控制器编程指南了解更多关于如何正确使用视图控制器。 https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/

我有几乎相同的问题。 原因是我试图给另一个“一些”控制器,并在animation完成后,我设置呈现控制器为根。 在这个操作之后,所有进一步的控制器给我带来警告:“ 不鼓励在分离的视图控制器上呈现视图控制器 ”。 而我解决这个警告只是设置“一些”控制器作为根在开始时没有任何介绍。

删除:

 [[self rootController] presentViewController:controller animated:YES completion:^{ [self window].rootViewController = controller; [[self window] makeKeyAndVisible];}]; 

只是作为根没有任何介绍:

  [[self window] setRootViewController:controller]; 

其中一个解决scheme是,如果你有childviewcontroller所以你只需presentviewcontroller给它的父母

 [self.parentViewController presentViewController:viewController animated:YES completion:nil]; 

而解雇使用相同的dismissview控制器。

 [self dismissViewControllerAnimated:YES completion:nil]; 

这是完美的解决scheme为我工作。

在iOS 8中使用[self.navigationController presentViewController:xxx animated:YES completion:nil]

试试这个代码

 UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:<your ViewController object>]; [self.view.window.rootViewController presentViewController:navigationController animated:YES completion:nil]; 

您需要添加视图控制器,将呈现新的控制器作为父视图控制器的子项。

比方说,你有你的主视图控制器,然后你添加一个名为controllerA的新控制器,然后你想从controllerA提出一个新的控制器controllerB

你必须写这样的东西:

 [self addChildViewController:controllerA]; //self is yourMainViewController [self.view addsubView:controllerA.view]; 

在控制器A内,您可以不带警告地显示新的控制器

 [self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA 

雅,即使我在显示另一个视图中的警报控制器时也面临同样的警告信息。 后来我通过从父视图控制器提供警报控制器避免了这一点,如下所示

 [self.parentViewController presentViewController:alertController animated:YES completion:nil]; 

Swift 3

对于任何人来说,这是一个迅速的答案。

 self.parent?.present(viewController, animated: true, completion: nil) 

很多这个警告的原因。 我的是因为我有一个从一个ViewController连接到另一个将以模态方式呈现的segue。 但是,我正在展示的ViewController是由PageViewControllerdynamic生成的。 这就是为什么它被分离在故事板中。 我的应用程序不会因为它而崩溃; 但是我想沉默这个警告。

确保你有一个根视图控制器开始。 你可以在didFinishLaunchingWithOptions设置它。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [window setRootViewController:viewController]; } 

如果它是基于TabBarController的应用程序,试着在TabBarController展示。

 [self.tabBarController presentViewController:viewController animated:YES completion:nil]; 

原因可能是selfTabBarController孩子,你正试图从一个ChildViewController呈现。