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

时间:2014-08-05 17:00:19

标签: ios xcode amslidemenu

我正在使用带有故事板的xcode 5.1.1。我在主菜单上有一个按钮,它会弹出到另一个具有此代码的视图控制器

VC *secondVC = [[VC alloc] init];
[self presentViewController:secondVC animated:YES completion: nil];

我有这个代码的后退按钮

[self dismissViewControllerAnimated:YES completion: nil];

当我弹出secondVC时,xcode给我的错误是:

  

在分离的视图控制器上显示视图控制器是不鼓励<UINavigationController: 0x8c94510>

我也遇到旋转问题,但无法正常工作。

10 个答案:

答案 0 :(得分:17)

如果您尝试在viewWillAppear中推送,显示或弹出视图控制器,则会出现此警告。我不知道你的代码中有什么,所以很难确定你的问题,但如果你试图在viewWillAppear中显示新的视图,请尝试使用它。

[self performSelector:@selector(yourMethod)
               withObject:nil afterDelay:0.0];

答案 1 :(得分:10)

我在尝试从viewWillAppear呈现UIAlertController时遇到了类似的情况。由于在Swift中不存在performSelector,我以这种方式包裹了我的调用:

dispatch_async(dispatch_get_main_queue()), {
    presentYourVCHere;
});

答案 2 :(得分:9)

改为从viewDidAppear:呈现控制器。

答案 3 :(得分:7)

尝试从rootVC推送:

[self.view.window.rootViewController.navigationController pushViewController:YOUR_VIEW_CONTROLER animated:YES];

答案 4 :(得分:2)

我正在尝试展示UIViewController中的splitViewController

这是解决我的问题的方法:

self.view.window.rootViewController.present(yourViewController, animated: true, completion: nil)

答案 5 :(得分:1)

如果有人想知道如何使用swift(甚至可以在Objective C中使用),请使用以下代码帮助我克服上述问题。在viewDidLoad()

中使用此代码
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), { () -> Void in
         //this place to call segue or manually load the view. 
})

答案 6 :(得分:1)

从a中呈现UIAlertController时遇到了同样的错误 UIViewController(vc2)嵌套在另一个UIViewController(vc1)

我这样解决了:

[vc1 addChildViewController:vc2]

执行此操作后,我可以从vc2呈现UIAlertController而不会出现任何错误消息。

答案 7 :(得分:1)

如果弹出视图控制器发生此错误,您需要使用委托调用代码直接从父视图显示警报控制器。例如,在父视图控制器中:

-(void) showAlertError: (YourClass *) whateverParameter {
    dispatch_async(dispatch_get_main_queue(), ^{
        UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Your Title"
                                                                       message:@"Your message"
                                                                preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                              handler:^(UIAlertAction * action) {}];
        [alert addAction:defaultAction];
        [self presentViewController:alert animated:YES completion:nil];
    });
}

在您孩子的观点中:

- (IBAction)btnDone:(id)sender{
    [self.delegate showAlertError:self];
}

答案 8 :(得分:0)

没有一个答案对我有帮助。这里是我用来解决问题的代码。

let topViewController = (self.navigationController?.viewControllers.last)! as UIViewController
topViewController.presentViewController(secondView, animated: true, completion: nil)

希望这会有所帮助:)

答案 9 :(得分:0)

请点击以下链接查看同一问题:

https://stackoverflow.com/a/43268601/2226399