在我的应用中,我正在使用导航控制器。稍后在某些视图中,我将presentViewController
用于显示缩放的图像。另外,我没有使用情节提要或笔尖。
我仅在iOS 7中收到此错误。它在iOS 6和更早的版本中运行良好:
不建议在分离的视图控制器上显示视图控制器
在我的应用中,我正在使用导航控制器。稍后在某些视图中,我将presentViewController
用于显示缩放的图像。另外,我没有使用情节提要或笔尖。
我仅在iOS 7中收到此错误。它在iOS 6和更早的版本中运行良好:
不建议在分离的视图控制器上显示视图控制器
Answers:
为了避免在推送导航中收到警告,您可以直接使用:
[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
然后在模态视图控制器中,当一切完成后,您可以调用:
[self dismissViewControllerAnimated:YES completion:nil];
self.navigationController
为我做了。
此警告的原因是我在不是全尺寸视图的小视图上显示了视图控制器。下面给出的是我的项目的图像。在上面单击四个选项。用户导航到其他childviewcontroller的视图。(其工作方式类似于tabViewcontroller)。但是childviewcontroller包含较小的视图。因此,如果我们呈现来自childviewcontroller的视图,则会发出此警告。
为了避免这种情况,您可以在childviewcontroller的父级上显示一个视图
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
等待 viewDidAppear()
:
如果尝试在视图实际出现之前呈现视图控制器,例如在viewWillAppear()
或更早的时间呈现视图,也会出现此错误。尝试在其后viewDidAppear()
或内部呈现另一个视图。
viewDidLoad()
!我犯了很多次这个错误……
就我而言,我将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];
我认为问题在于您没有适当的视图控制器层次结构。设置应用程序的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];
TabBarController
如果它是一个TabBarController
基于应用程序,请尝试演示。
[self.tabBarController presentViewController:viewController animated:YES completion:nil];
原因可能self
是的孩子,TabBarController
而您正试图从中提出礼物ChildViewController
。
是的,在显示另一个视图中的Alert控制器时,我也遇到了同样的警告消息。后来我通过从父视图控制器呈现警报控制器来避免这种情况,如下所示:
[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
在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)
})
我到达了这个线程,那里有一个自定义导航栏,并且正在通过它调用AlertViewController。
我必须将其作为孩子添加到主视图控制器中。然后,我可以在没有任何警告的情况下称呼它。
您应该添加您的 Zoomed Image View Controller
为主ViewController的子级。
(例如)
[self addChildViewController:ZoomedImageViewController];
然后您就可以调用ZoomedImageViewController
[self presentViewController:ZoomedImageViewController];
许多答案是正确的。
当我的同事向BViewController添加AViewController时,这个问题发生了。不知何故,他只是将AViewController的视图添加到BViewController的视图。
通过添加bViewController.addChild(aViewController)进行修复
这取决于您是否要在任何类型的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!