我有:导航控制器-> tableViewController->标签栏控制器-> ViewController1 / ViewController2 / ViewController3
我单击TableViewController上的一个单元格,然后打开TabBar。一切都很好
但是,我想从TableViewController中的数据中获取更多详细信息,因此我决定弹出一个包含单元格内容的弹出窗口。我发现本教程https://www.youtube.com/watch?v=S5i8n_bqblE =>很棒!这是与带有弹出窗口的viewcontroller一起使用segue“以模态形式呈现”的。我做了一个从弹出窗口到tabBarController的链接,而我丢失了导航栏
我尝试过使用navigationBar,但没有任何效果。我更改了segue的类型,但没有得到想要的东西。
我认为问题出在segue的类型上。如果在viewController中像go / back一样使用它就可以了。您对使用这种弹出窗口有任何解决方案,还是必须使用其他方式?
谢谢
答案 0 :(得分:0)
好吧,让我们看一下。
导航栏是导航控制器提供的视图。有时,我们对导航栏和导航项感到困惑。导航栏是唯一的导航栏,它属于导航控制器,导航项属于导航堆栈中的单个视图控制器。因此,第一步很简单:如果要使用导航栏,请将模态显示的控制器包装到导航堆栈中。
是的,您将面临其他问题,先前控制器的模糊视图将变为黑色区域。为什么?有一个称为Presentation Controller(UIPresentationController
)的特殊对象,它负责控制器的显示方式。并且默认情况下它会隐藏前一个控制器的视图(我认为出于性能考虑)。
好,我们继续前进。我们可以创建自定义表示控制器,并告诉它不要隐藏先前控制器的视图。像这样:
class CustomPresentationController: UIPresentationController {
override var shouldRemovePresentersView: Bool {
return false
}
}
viewDidLoad
为时已晚:控制器已经初始化:class PopupViewController: UIViewController {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
modalPresentationStyle = .custom
transitioningDelegate = self
}
}
PopupViewController
成为其自己的过渡的委托时,表示此控制器负责所有这些事务。在我们的特殊情况下,弹出控制器提供了呈现控制器的自定义版本。像这样:extension PopupViewController: UIViewControllerTransitioningDelegate {
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
return CustomPresentationController(presentedViewController: presented, presenting: presenting)
}
}
仅此而已。现在您应该看到以前控制器的视图。