【问题标题】: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 的蓝色方块)。

标签: ios swift uitabbarcontroller uimodalpresentationstyle


【解决方案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的视频
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
相关资源
最近更新 更多