在UITabBarController的当前上下文中呈现模态视图控制器之后的黑屏

我的根视图控制器是一个UITabBarController。 我试图通过其中一个标签栏控制器的视图控制器呈现一个模式的视图控制器,但仍然允许标签栏被用来去一个不同的选项卡 – 换句话说,我想模式只能中断该特定标签的stream程,而不是整个应用程序。

为了做到这一点,我已经在storyboard中将呈现视图控制器的performance风格设置为“Over Current Context”。 我遇到的问题是,在呈现模式视图控制器并select新选项卡后,呈现视图控制器的视图将从窗口中删除,并且在closures呈现的视图控制器时不会将其添加回窗口。 closures视图控制器后,移动到另一个选项卡,然后返回,最后把呈现视图控制器放回窗口。

我已经使用Xcode中的“Tabbed”模板复制了我的问题。

在呈现模态之后 – 我已经为所呈现的视图控制器添加了透明度,以便轻松看到呈现的视图控制器中发生了什么。

更改为第二个选项卡,然后返回 – 呈现视图控制器的视图现在已被删除。

closures模式会使呈现视图控制器的视图仍然从窗口中移除。 转到选项卡2并返回将视图添加回窗口。

我希望这是简单的,我已经忽略了故事板,但事实上,我可以提出的模式,并看到它之前更改制表符之前提出的视图控制器让我觉得我已经正确设置的东西。

我有同样的问题,并能够解决它通过设置self.definesPresentationContext = YES; 在呈现模态VC之前在呈现视图控制器上。 您还可以在故事板中设置此选项,checkbox在Interface Builder中称为“定义上下文”。

iOS 10 +和Swift 3+

我有这个问题的很好的解决scheme。 正在呈现使用全屏模态演示风格的视图控制器。

 let storyboard = UIStoryboard(name: "Main", bundle: nil) // Replace “Main” with your storyboard name if let viewController = storyboard?.instantiateViewController(withIdentifier: “viewController Identifier”) as? ViewController { viewController.modalPresentationStyle = .overFullScreen self.present(viewController, animated: false, completion: { }) } 

全屏显示将覆盖您的视图控制器在您的标签栏(控制器)。 因此,最终用户不能切换tabbar(除非您以编程方式执行操作)tabbar项目。 用户必须closures此视图控制器才能切换选项卡栏。

如果您使用的是segue,则要显示视图控制器,然后在属性检查中从模态表示样式中select“Over Full Screen”

尝试在应用程序窗口中呈现视图控制器。 我有一个类似的问题,由以下代码修复:

  let myNewVC = mainStoryBoard.instantiateViewController(withIdentifier: "MyNewVCId") as! MyNewVC let navController = UINavigationController(rootViewController: myNewVC) navController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext let appDelegate = UIApplication.shared.delegate as? AppDelegate appDelegate?.window?.rootViewController?.present(navController, animated: true, completion: nil) 

希望这也能帮助你。

与我的标签控制器有一个类似的问题,然而就像评论,我build议改变赛格推或展示赛格。 当切换到其他选项卡时,这将使该选项卡保持原有状态,而不是旧视图。 如果美学是一个问题,您可以使自定义的导航控制器自定义新视图的外观。

我转载了你的问题,并find了解决办法。 它不涉及改变赛格方法或改变故事板中的一些属性。

build议:

但是在进入解决scheme之前,我想补充一下,模态表示的视图控制器的目的是破坏应用程序的实际stream程,并为呈现vc呈现一些额外的上下文信息或一些可操作的内容。 简单地说,这是非常合乎逻辑的,并且实际上build议在模态地呈现视图控制器时覆盖标签栏。 在app store里有很多很好的例子。

说了这里是我提出的解决scheme。

解:

我相信问题在于UITabBarController处理其视图层次的方式。

我所做的是在选项卡被更改之前明确地解除了模态表示的视图控制器。 这使得呈现视图控制器在标签栏切换到新标签之前保持在UITabBarViewController的视图层次结构中。

在你的模式化的ViewController的“viewWillDisappear”方法中添加这个。

 - (void)viewWillDisappear:(BOOL)animated { [self dismissViewControllerAnimated:true completion:^{ [super viewWillDisappear:animated]; }]; } 

在现在的快捷项目中我有同样的问题。 我已经做了解决方法。

然后最后我已经使用NSNotificationCenter并closures该视图控制器时更改选项卡来解决此问题。

我在AppDelegate引用了tabbar控制器,并在那里设置委托。

 let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let tabbarcontroller = storyboard.instantiateViewControllerWithIdentifier("MyTabBarController") as! UITabBarController tabbarcontroller.delegate = self 

这是代表作为

 //MARK: - Tabbar controller delegate extension AppDelegate : UITabBarControllerDelegate { func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { NSNotificationCenter.defaultCenter().postNotificationName("TabBarTabChanged", object: nil) } } 

然后我添加观察者在我提交的视图控制器中

 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PreviewPlaceVC.BackClickAction(_:)), name: "TabBarTabChanged", object: nil) } // MARK: - Button Click Actions @IBAction func BackClickAction(sender: AnyObject) { self.dismissViewControllerAnimated(true, completion: nil) } 

这对我来说很好。 不是一个合适的解决scheme,我认为解雇视图控制器的选项卡更改事件,但可以解雇,而不是黑屏,这也打破了当时的导航。

尝试在故事板中将演示文稿样式设置为“全屏”而不是“过度上下文”。 在这里输入图像说明