Ios 警告:-不建议在分离的视图控制器上显示视图控制器

Ios 警告:-不建议在分离的视图控制器上显示视图控制器,ios,iphone,ios7,warnings,Ios,Iphone,Ios7,Warnings,在我的应用程序中,我使用的是导航控制器。稍后在一些视图中,我使用presentViewController显示缩放图像。 此外,我没有使用故事板或笔尖 我只在iOS 7中遇到这个错误。它在iOS 6及更早版本中运行良好: 在分离的视图控制器上显示视图控制器是不正确的 气馁 我认为问题在于您没有适当的视图控制器层次结构。设置应用程序的rootviewcontroller,然后通过在其上推送或显示新视图控制器来显示新视图。让每个视图控制器管理其视图。只有容器视图控制器(如tabbarviewcont

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

我只在iOS 7中遇到这个错误。它在iOS 6及更早版本中运行良好:

在分离的视图控制器上显示视图控制器是不正确的 气馁


我认为问题在于您没有适当的视图控制器层次结构。设置应用程序的rootviewcontroller,然后通过在其上推送或显示新视图控制器来显示新视图。让每个视图控制器管理其视图。只有容器视图控制器(如tabbarviewcontroller)才应该将其他视图控制器视图添加到它们自己的视图中。阅读《视图控制器编程指南》,了解有关如何正确使用视图控制器的更多信息

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

[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
然后在模态视图控制器中,当一切完成时,您可以调用:


[自解除视图控制器激活:是完成:无]

确保您有一个根视图控制器开始。您可以在
didfishlaunchingwithoptions
中进行设置

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

我几乎有同样的问题。原因是我试图在另一个控制器上显示“某些”控制器,动画完成后,我将显示的控制器设置为根。执行此操作后,所有进一步显示的控制器将显示警告:“不建议在分离的视图控制器上显示视图控制器。”。我解决了这个警告,只需将“some”控制器设置为root,一开始就没有任何表示

删除:

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

       [self window].rootViewController = controller;

       [[self window] makeKeyAndVisible];}];
只需以root身份创建,无需任何演示:

 [[self window] setRootViewController:controller];

此警告的原因是我在一个不是全尺寸视图的小视图上显示了一个视图控制器。下面是我的项目图片。点击上面的四个选项。用户导航到不同的childviewcontroller视图。(其工作原理类似于tabViewcontroller)。但是childviewcontroller包含小尺寸的视图。因此,如果我们从childviewcontroller显示一个视图,它会发出此警告

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

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

解决这个问题的一个方法是,如果您有childviewcontroller,那么只需通过给定的

[self.parentViewController presentViewController:viewController animated:YES completion:nil];
对于Dismission,请使用相同的dismissview控制器

[self dismissViewControllerAnimated:YES completion:nil];

这对我来说是一个完美的解决方案。

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

在我的例子中,我添加了一个
sampleViewController
的视图作为子视图,然后尝试从
sampleViewController
的视图中显示一个弹出窗口(这里是
self
而不是
UIViewController
实例):

正确的方法应该是:

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


B.t.w.,这也适用于从tableview单元格显示popover的情况,您只需确保tableview控制器也已添加为子视图控制器。

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

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

等待查看显示()

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

您需要添加视图控制器,以将新控制器显示为父视图控制器的子视图

[self dismissViewControllerAnimated: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
试试这个代码

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

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

[self.view.window.rootViewController当前视图控制器:导航控制器已设置动画:是完成:无];
出现此警告的原因很多。我的原因是我有一个从ViewController连接到另一个将以模式显示的segue。但是,我从中显示的ViewController是由PageViewController动态生成的。这就是为什么它会在情节提要中分离。我的应用不会因此而崩溃;但我不会我想让警告静音。

Swift 3

对于任何在这个问题上绊倒的人,这里有一个快速的答案

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

如果是基于
TabBarController
的应用程序,请尝试在
TabBarController
上演示

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

原因可能是
self
TabBarController
的子对象,并且您正试图从
ChildViewController
显示,这取决于您是否希望在任何类型的UIViewController中显示警报或类似内容

[self dismissViewControllerAnimated:YES completion:nil];
您可以使用以下代码示例:

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

在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)
//Made Changes here    
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)

present(alert, animated: true, completion: nil) 
Presenting view controllers on detached view controllers is discouraged <MyAppName.ViewController: 0x7fa95560Z070>.

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

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

您应该将缩放的图像视图控制器添加为主视图控制器的子视图

[self dismissViewControllerAnimated:YES completion:nil];
(例如)

然后您可以调用ZoomMedimageViewController

[self presentViewController:ZoomedImageViewController];

许多答案是正确的

  • 检查您的presentingViewController是否具有parentViewController
  • 如果没有,请将其添加到应该添加的位置
  • 否则,我检查一下