如何从标签栏控制器弹出或模态显示视图控制器?

Posted

技术标签:

【中文标题】如何从标签栏控制器弹出或模态显示视图控制器?【英文标题】:How to PopUp or Modally Present View Controller from Tab Bar Controller? 【发布时间】:2018-05-22 15:29:20 【问题描述】:

如何创建一个在标签栏上的按钮被按下时出现的弹出窗口?我想要类似的东西:https://www.youtube.com/watch?v=zDWSaItF2ko.

我尝试了很多解决方案,但都没有奏效。

例如,我用我的主视图控制器尝试过这个:

这仍然不起作用。我将如何去创造这个。我知道我需要在当前上下文中以模态方式呈现视图控制器,但我将如何从标签栏控制器中做到这一点。

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool 
    if viewController is PopupViewController 
        if let popupView = tabBarController.storyboard?.instantiateInitialViewController() 
            popupView.modalPresentationStyle = .fullScreen
            tabBarController.present(popupView, animated: true, completion: nil)

            return false
        
    
    return true

这里有一些图片可能会有所帮助:

主要故事板:

弹出故事板:

查看控制器代码:

【问题讨论】:

“我知道我需要在当前上下文中以模态方式呈现视图控制器” 实际上,不。在您提到的 YouTube 视频中,这不是当前的上下文演示:它是“全屏”演示。它可能使用自定义展示控制器来设置展示视图的大小/位置(带有 Test 和 Done 的蓝色方块)。 【参考方案1】:

您是否尝试过在 Xcode 中使用断点进行调试?据我所知,您要做的第一件事是检查应该选择的视图控制器是否属于PopupViewController 类。你确定视图控制器被正确实例化了吗?

顺便说一句,我会推荐另一种从情节提要中实例化视图控制器的方法,而不是:

tabBarController.storyboard?.instantiateInitialViewController()

第一件事是转到情节提要文件本身,并在视图控制器中尝试将Storyboard ID 更改为例如情节提要的类(在您的情况下为PopupViewController)。

接下来,您将尝试使用 init(name: String, bundle storyboardBundleOrNil: Bundle?) 初始化程序实例化情节提要本身:

let storyboard = UIStoryboard(name: "Popup", bundle: nil)

现在使用storyboard 变量实例化视图控制器,如下所示:

let popupViewController  = storyboard.instantiateViewController(withIdentifier: "PopupViewController") as! PopupViewController

最后你可以给它一些额外的配置并在标签栏控制器上展示它:

popupViewController.modalPresentationStyle = .fullScreen
tabBarController.present(popupViewController, animated: true)

编辑

另外为了让它更Swifty,我推荐guard 声明提前退出。最后,该方法可能看起来像这样:

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool 
    guard viewController is PopupViewController else  return true 
    let storyboard = UIStoryboard(name: "Popup", bundle: nil)
    let popupViewController = storyboard.instantiateViewController(withIdentifier: "PopupViewController") as! PopupViewController
    popupViewController.modalPresentationStyle = .fullScreen
    tabBarController.present(popupViewController, animated: true, completion: nil)
    return false

【讨论】:

我收到一个线程 1:信号 SIGABRT 错误,但没有断开任何插座。它在应用委托文件中。 完整的错误信息是什么?您能否在 github 或其他地方分享该项目,以便我自己运行以进行更好的检查? 我想告诉你,这只是一个测试项目,以便我可以将此功能整合到更大的应用程序中。 好的,所以导致崩溃的是Main.storyboard 中的引用。单击它并将Popup 作为参考故事板。更改后,一切都应该按预期工作。 这几乎奏效了,我不敢相信我错过了;但是,当弹出窗口“弹出”时,背景最初是透明的,显示后面的内容,然后变成纯黑色。这是youtu.be/SIfvVzMCF0M的视频

以上是关于如何从标签栏控制器弹出或模态显示视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

模态视图控制器隐藏标签栏

从模态视图切换到标签栏视图控制器并且不会丢失标签栏

如何重绘标签栏控制器显示的视图

如何在视图控制器中的标签栏和导航栏上全屏显示弹出视图?

标签栏控制器中的模态视图

ios标签栏点击显示模态视图黑屏