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