在我的应用程序中,我使用的是导航控制器。稍后在某些视图中,我使用 presentViewController
显示缩放图像。我也没有使用故事板或笔尖。
我仅在 iOS 7 中收到此错误。它在 iOS 6 及更早版本中运行良好:
不鼓励在分离的视图控制器上呈现视图控制器
为避免在推送导航中收到警告,您可以直接使用:
[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
然后在您的模态视图控制器中,当一切都完成后,您可以调用:
[self dismissViewControllerAnimated:YES completion:nil];
等待 viewDidAppear()
:
如果您尝试在视图实际出现之前呈现视图控制器,例如在 viewWillAppear()
或更早版本中呈现视图,也会出现此错误。尝试在 viewDidAppear()
之后或其内部呈现另一个视图。
viewDidLoad()
中显示任何视图控制器,各位!这个错误我犯过很多次了...
这个警告的原因是我在一个不是全尺寸视图的小视图上展示了一个视图控制器。下面给出的是我的项目的图像。点击上面的四个选项。用户导航到不同的 childviewcontroller 的视图。(它像 tabViewcontroller 一样工作)。但是 childviewcontroller 包含小尺寸的视图。因此,如果我们从 childviewcontroller 呈现一个视图,它会给出这个警告。
https://i.stack.imgur.com/slvz5.png
为了避免这种情况,您可以在 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];
顺便说一句,这也适用于从表格视图单元格中显示弹出框的情况,您只需要确保表格视图控制器也已添加为子视图控制器。
[self addChildViewController:sampleViewController];
,现在我添加了这个,谢谢
斯威夫特 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];
解决方案之一是如果您有 childviewcontroller 所以您只需通过给定的方式在其父级上显示viewcontroller
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
并且对于解雇使用相同的解雇视图控制器。
[self dismissViewControllerAnimated:YES completion:nil];
这是对我有用的完美解决方案。
在 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];
在 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)
})
如果它是基于 TabBarController
的应用程序,请尝试在 TabBarController
上展示。
[self.tabBarController presentViewController:viewController animated:YES completion:nil];
原因可能是 self
是 TabBarController
的子级,而您正试图从 ChildViewController
呈现。
是的,在显示另一个视图中的警报控制器时,我也遇到了同样的警告消息。后来我通过从父视图控制器中显示警报控制器来避免这种情况,如下所示:
[self.parentViewController presentViewController:alertController animated:YES completion:nil];
您需要添加将新控制器作为父视图控制器的子级呈现的视图控制器。
假设您有您的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];
Attempt to present <UIAlertController: 0x7fc01a1eb600> on <ViewController: 0x7fc019821e00> whose view is not in the window hierarchy!
很多答案都是对的。
检查您的presentingViewController 是否有parentViewController。
如果不是,请将其添加到应添加的位置
否则,检查它的 parentViewController 是否有 parentViewController 递归,直到每个 viewController 都有父
当我的同事将 AViewController 添加到 BViewController 时,我发生了这个问题。不知何故,他只是将 AViewController 的视图添加到 BViewController 的视图中。
通过添加 bViewController.addChild(aViewController) 修复
self.navigationController
为我做到了。