如何使用segue“模态呈现”来维持导航?

时间:2019-08-29 16:44:33

标签: swift xcode

enter image description here 我有:导航控制器-> tableViewController->标签栏控制器-> ViewController1 / ViewController2 / ViewController3

我单击TableViewController上的一个单元格,然后打开TabBar。一切都很好

但是,我想从TableViewController中的数据中获取更多详细信息,因此我决定弹出一个包含单元格内容的弹出窗口。我发现本教程https://www.youtube.com/watch?v=S5i8n_bqblE =>很棒!这是与带有弹出窗口的viewcontroller一起使用segue“以模态形式呈现”的。我做了一个从弹出窗口到tabBarController的链接,而我丢失了导航栏

enter image description here

我尝试过使用navigationBar,但没有任何效果。我更改了segue的类型,但没有得到想要的东西。

我认为问题出在segue的类型上。如果在viewController中像go / back一样使用它就可以了。您对使用这种弹出窗口有任何解决方案,还是必须使用其他方式?

谢谢

1 个答案:

答案 0 :(得分:0)

好吧,让我们看一下。

  1. 导航栏是导航控制器提供的视图。有时,我们对导航栏和导航项感到困惑。导航栏是唯一的导航栏,它属于导航控制器,导航项属于导航堆栈中的单个视图控制器。因此,第一步很简单:如果要使用导航栏,请将模态显示的控制器包装到导航堆栈中。

  2. 是的,您将面临其他问题,先前控制器的模糊视图将变为黑色区域。为什么?有一个称为Presentation Controller(UIPresentationController)的特殊对象,它负责控制器的显示方式。并且默认情况下它会隐藏前一个控制器的视图(我认为出于性能考虑)。

  3. 好,我们继续前进。我们可以创建自定义表示控制器,并告诉它不要隐藏先前控制器的视图。像这样:

class CustomPresentationController: UIPresentationController {
    override var shouldRemovePresentersView: Bool {
        return false
    }
}
  1. 下一步。在控制器中,我们希望以模态形式呈现,我们必须对事物进行指定:我们要使用自定义呈现控制器,并且还希望调整委托对象以进行过渡(可以在其中指定自定义呈现控制器)。诀窍是您必须在初始化程序中执行此操作,因为viewDidLoad为时已晚:控制器已经初始化:
class PopupViewController: UIViewController {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        modalPresentationStyle = .custom
        transitioningDelegate = self
    }
}
  1. 最后一步。当PopupViewController成为其自己的过渡的委托时,表示此控制器负责所有这些事务。在我们的特殊情况下,弹出控制器提供了呈现控制器的自定义版本。像这样:
extension PopupViewController: UIViewControllerTransitioningDelegate {
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
        return CustomPresentationController(presentedViewController: presented, presenting: presenting)
    }
}

仅此而已。现在您应该看到以前控制器的视图。