在我的应用程序中,我使用的是导航控制器。稍后在某些视图中,我使用它presentViewController
来显示缩放图像。我也没有使用故事板或笔尖。
我仅在 iOS 7 中收到此错误。它在 iOS 6 及更早版本中运行良好:
不鼓励在分离的视图控制器上呈现视图控制器
在我的应用程序中,我使用的是导航控制器。稍后在某些视图中,我使用它presentViewController
来显示缩放图像。我也没有使用故事板或笔尖。
我仅在 iOS 7 中收到此错误。它在 iOS 6 及更早版本中运行良好:
不鼓励在分离的视图控制器上呈现视图控制器
为避免在推送导航中收到警告,您可以直接使用:
[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
然后在您的模态视图控制器中,当一切都完成后,您可以调用:
[self dismissViewControllerAnimated:YES completion:nil];
等待viewDidAppear()
:
如果您尝试在视图实际出现之前呈现视图控制器,例如在viewWillAppear()
或更早的时候呈现视图,也会出现此错误。尝试在viewDidAppear()
它之后或内部呈现另一个视图。
这个警告的原因是我在一个不是全尺寸视图的小视图上展示了一个视图控制器。下面给出的是我的项目的图像。点击上面的四个选项。用户导航到不同的 childviewcontroller 的视图。(它像 tabViewcontroller 一样工作)。但是 childviewcontroller 包含小尺寸的视图。因此,如果我们从 childviewcontroller 呈现一个视图,它会给出这个警告。
为了避免这种情况,您可以在 childviewcontroller 的父级上显示一个视图
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
就我而言,我将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];
顺便说一句,这也适用于从表格视图单元格中显示弹出框的情况,您只需要确保表格视图控制器也已添加为子视图控制器。
斯威夫特 3
对于任何绊倒此的人,这里是快速的答案。
self.parent?.present(viewController, animated: true, completion: nil)
我认为问题在于您没有正确的视图控制器层次结构。设置应用程序的 rootviewcontroller,然后通过在其上推送或呈现新视图控制器来显示新视图。让每个视图控制器管理他们的视图。只有容器视图控制器,如 tabbarviewcontroller,应该将其他视图控制器视图添加到它们自己的视图中。阅读视图控制器编程指南以了解有关如何正确使用视图控制器的更多信息。https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/
我有几乎同样的问题。原因是我试图在另一个上呈现“一些”控制器,动画完成后我将呈现的控制器设置为 root。在此操作之后,所有进一步呈现的控制器都会给我带来警告:“不鼓励在分离的视图控制器上呈现视图控制器”。我解决了这个警告,只是将“某些”控制器设置为 root,一开始没有任何演示。
删除:
[[self rootController] presentViewController:controller animated:YES completion:^{
[self window].rootViewController = controller;
[[self window] makeKeyAndVisible];}];
只需以 root 身份制作,无需任何演示:
[[self window] setRootViewController:controller];
[self.navigationController presentViewController:xxx animated:YES completion:nil]
在 iOS 8 中使用。
解决方案之一是如果您有 childviewcontroller 所以您只需通过给定的方式在其父级上显示viewcontroller
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
并且对于解雇使用相同的解雇视图控制器。
[self dismissViewControllerAnimated:YES completion:nil];
这是对我有用的完美解决方案。
在 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)
})
试试这个代码
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:<your ViewController object>];
[self.view.window.rootViewController presentViewController:navigationController animated:YES completion:nil];
是的,在显示另一个视图中的警报控制器时,我也遇到了同样的警告消息。后来我通过从父视图控制器中显示警报控制器来避免这种情况,如下所示:
[self.parentViewController presentViewController:alertController animated:YES completion:nil];
TabBarController
如果它是TabBarController
基于应用程序,请尝试演示。
[self.tabBarController presentViewController:viewController animated:YES completion:nil];
原因可能self
是 的孩子,TabBarController
而您正试图从ChildViewController
.
您需要添加将新控制器作为父视图控制器的子级呈现的视图控制器。
假设您有您的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
我在这个线程上找到了一个自定义导航栏,并通过它调用了一个 AlertViewController。
我不得不将它作为一个孩子添加到我的主视图控制器中。然后我可以在没有任何警告的情况下调用它。
您应该将您的添加Zoomed Image View Controller
为主 ViewController 的子项。
(例如)
[self addChildViewController:ZoomedImageViewController];
然后你就可以调用你的 ZoomedImageViewController
[self presentViewController:ZoomedImageViewController];
确保你有一个根视图控制器开始。您可以将其设置在didFinishLaunchingWithOptions
.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[window setRootViewController:viewController];
}
这个警告有很多原因。我的是因为我有一个从 ViewController 连接到另一个将以模态方式呈现的 segue。但是,我展示的 ViewController 是由 PageViewController 动态生成的。这就是它在情节提要中分离的原因。我的应用程序不会因此而崩溃;但我想消除警告。
这取决于您是否想在任何类型的 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];
很多答案都是对的。
当我的同事将 AViewController 添加到 BViewController 时,我发生了这个问题。不知何故,他只是将 AViewController 的视图添加到 BViewController 的视图中。
通过添加 bViewController.addChild(aViewController) 修复