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

时间:2018-05-22 15:29:21

标签: ios swift uitabbarcontroller uimodalpresentationstyle

如何创建按Tab键上的按钮时显示的弹出窗口?我想要类似的东西: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
}

以下是一些可能有用的图片:

主要故事板:

Main Storyboard

弹出式故事板:

Popup Storyboard

查看控制器代码:

View Controller Code

1 个答案:

答案 0 :(得分: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
}