188

在我的应用程序中,我使用的是导航控制器。稍后在某些视图中,我使用它presentViewController来显示缩放图像。我也没有使用故事板或笔尖。

我仅在 iOS 7 中收到此错误。它在 iOS 6 及更早版本中运行良好:

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

4

19 回答 19

211

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

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

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

[self dismissViewControllerAnimated:YES completion:nil];

于 2014-01-08T18:44:11.347 回答
73

等待viewDidAppear()

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

于 2015-08-07T12:28:07.447 回答
64

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

主细节视图

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

  [self.parentViewController presentViewController:viewController animated:YES completion:nil];
于 2014-08-07T12:38:00.457 回答
23

就我而言,我将sampleViewController' 的视图添加为子视图,然后尝试从以下视图中显示一个弹出框sampleViewController(这里self是一个UIViewController实例):

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

顺便说一句,这也适用于从表格视图单元格中显示弹出框的情况,您只需要确保表格视图控制器也已添加为子视图控制器。

于 2015-02-23T10:57:24.093 回答
20

斯威夫特 3

对于任何绊倒此的人,这里是快速的答案。

self.parent?.present(viewController, animated: true, completion: nil)
于 2017-05-12T01:00:23.173 回答
16

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

于 2013-12-10T05:12:31.587 回答
9

我有几乎同样的问题。原因是我试图在另一个上呈现“一些”控制器,动画完成后我将呈现的控制器设置为 root。在此操作之后,所有进一步呈现的控制器都会给我带来警告:“不鼓励在分离的视图控制器上呈现视图控制器”。我解决了这个警告,只是将“某些”控制器设置为 root,一开始没有任何演示。

删除:

[[self rootController] presentViewController:controller animated:YES completion:^{

       [self window].rootViewController = controller;

       [[self window] makeKeyAndVisible];}];

只需以 root 身份制作,无需任何演示:

 [[self window] setRootViewController:controller];
于 2014-06-27T09:57:46.140 回答
7

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

于 2014-10-14T09:05:01.110 回答
7

解决方案之一是如果您有 childviewcontroller 所以您只需通过给定的方式在其父级上显示viewcontroller

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

并且对于解雇使用相同的解雇视图控制器。

[self dismissViewControllerAnimated:YES completion:nil];

这是对我有用的完美解决方案。

于 2014-10-08T11:31:47.690 回答
5

在 Swift 4.1 和 Xcode 9.4.1

解决方案是

DispatchQueue.main.async(execute: {
    self.present(alert, animated: true)
})

如果这样写,我会遇到同样的错误

let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
    })
alert.addAction(defaultAction)

present(alert, animated: true, completion: nil) 

我遇到同样的错误

Presenting view controllers on detached view controllers is discouraged <MyAppName.ViewController: 0x7fa95560Z070>.

完整的解决方案是

let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
     })
alert.addAction(defaultAction)
//Made Changes here    
DispatchQueue.main.async(execute: {
    self.present(alert, animated: true)
})
于 2018-08-28T05:37:46.580 回答
5

试试这个代码

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:<your ViewController object>];

[self.view.window.rootViewController presentViewController:navigationController animated:YES completion:nil];
于 2016-03-11T17:01:13.747 回答
4

是的,在显示另一个视图中的警报控制器时,我也遇到了同样的警告消息。后来我通过从父视图控制器中显示警报控制器来避免这种情况,如下所示:

[self.parentViewController presentViewController:alertController animated:YES completion:nil];
于 2015-05-27T05:47:22.550 回答
4

TabBarController如果它是TabBarController基于应用程序,请尝试演示。

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

原因可能self是 的孩子,TabBarController而您正试图从ChildViewController.

于 2017-08-22T10:07:50.170 回答
3

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

假设您有您的MainViewController,然后添加一个名为controllerA 的新控制器,然后您想从controllerA 呈现一个名为controllerB 的新控制器

你必须写这样的东西:

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

在 controllerA 中,您可以在没有警告的情况下展示新的控制器

[self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA
于 2015-08-21T17:59:55.083 回答
2

我在这个线程上找到了一个自定义导航栏,并通过它调用了一个 AlertViewController。

我不得不将它作为一个孩子添加到我的主视图控制器中。然后我可以在没有任何警告的情况下调用它。

您应该将您的添加Zoomed Image View Controller为主 ViewController 的子项。

(例如)

[self addChildViewController:ZoomedImageViewController];

然后你就可以调用你的 ZoomedImageViewController

[self presentViewController:ZoomedImageViewController];
于 2019-07-30T10:00:30.210 回答
1

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [window setRootViewController:viewController];
}
于 2014-04-14T13:55:39.430 回答
1

这个警告有很多原因。我的是因为我有一个从 ViewController 连接到另一个将以模态方式呈现的 segue。但是,我展示的 ViewController 是由 PageViewController 动态生成的。这就是它在情节提要中分离的原因。我的应用程序不会因此而崩溃;但我想消除警告。

于 2016-04-27T15:01:32.320 回答
1

这取决于您是否想在任何类型的 UIViewController 中显示警报或类似的东西。

您可以使用此代码示例:

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Example" preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:nil];

[alert addAction:cancelAction];


[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:alert animated:true completion:nil];
于 2018-03-04T01:20:46.673 回答
1

很多答案都是对的。

  • 检查您的presentingViewController 是否有parentViewController。
  • 如果不是,请将其添加到应添加的位置
  • 否则,检查它的 parentViewController 是否有 parentViewController 递归,直到每个 viewController 都有父

当我的同事将 AViewController 添加到 BViewController 时,我发生了这个问题。不知何故,他只是将 AViewController 的视图添加到 BViewController 的视图中。

通过添加 bViewController.addChild(aViewController) 修复

于 2020-02-07T06:21:20.720 回答