如何从选项卡栏控制器弹出或以模态方式呈现视图控制器?

How to PopUp or Modally Present View Controller from Tab Bar Controller?

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

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

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

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

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
}

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

主要故事板:

弹出故事板:

查看控制器代码:

您是否尝试过使用 Xcode 中的断点进行调试?据我所知,您首先要做的是检查应选择的视图控制器是否为 class PopupViewController。您确定视图控制器实例化正确吗?

顺便说一下,我会推荐另一种从故事板实例化视图控制器的方法,而不是:

tabBarController.storyboard?.instantiateInitialViewController()

第一件事是转到情节提要文件本身,并在您尝试实例化的视图控制器中将 Storyboard ID 更改为情节提要的 class 等内容(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
}