如何从选项卡栏控制器弹出或以模态方式呈现视图控制器?
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
}
如何创建在按下标签栏上的按钮时出现的弹出窗口?我想要类似这样的东西: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
}