我有一个 tabbar 控制器,假设如果用户转到第三个选项卡并在第三个视图控制器中,用户按下一个按钮,然后我将视图控制器显示为 modal 。
现在如果用户切换选项卡让说选项卡 1 或 2 而不关闭模态呈现的视图控制器,意味着当他回到选项卡 3 时,用户仍然可以看到模态呈现的视图控制器,现在如果用户关闭这里是模态呈现的视图控制器,然后是黑屏而不是打开模态呈现的视图控制器的视图控制器。
可能的解决方法是我隐藏标签栏控制器,以便用户必须首先关闭以模态呈现的视图控制器。但这不是现在的要求。由于某些原因,我无法隐藏底部标签栏控制器。
请建议我如何执行以下操作
答案 0 :(得分:1)
您可以使用 UITabBarControllerDelegate
来完成。
选项 1:创建 UITabBarController 的子类
class MyTabBar: UITabBarController, UITabBarControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if let currentlySelectedViewController = self.viewControllers?[self.selectedIndex] as? YourThirdTabViewController,
let presentedViewController = currentlySelectedViewController.presentedViewController {
presentedViewController.dismiss(animated: false, completion: nil)
}
return true
}
}
这里我假设我有自己的 UITabBarController
子类,它在视图 didLoad 中使用 UITabBarControllerDelegate
设置为 self.delegate = self
。
选项 2: 在它们的 UITabBarControllerDelegate
中制作 TabBarController 的 ViewController ViewDidLoad
如果您不想拥有自己的 UITabBarController
子类,您只需在每个 UITabBarControllerDelegate
的 ViewController
中将自己设置为 ViewDidLoad
如果您决定不继承 UIViewController
的路径,您可以对 UITabBarControllerDelegate
使用通用协议或扩展并确认 UITabBarController
以避免代码重复
protocol TabBarControllerProtocol: UITabBarControllerDelegate where Self: UIViewController {}
extension TabBarControllerProtocol {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if let currentlySelectedViewController = self.tabBarController?.viewControllers?[self.tabBarController?.selectedIndex ?? 0] as? SomeViewController,
let presentedViewController = currentlySelectedViewController.presentedViewController {
presentedViewController.dismiss(animated: false, completion: nil)
}
return true
}
}
无论在哪个 ViewController 中,您都可以说要启用此逻辑
class SomeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.tabBarController?.delegate = self
}
}
extension SomeViewController: TabBarControllerProtocol {}
就是这样。
shouldSelect viewController
每次用户点击标签切换时都会被调用。
if 条件检查 selectedIndex 处的 ViewController
(已选择不是新的)是否是特定感兴趣的 viewController 并检查此视图控制器是否已呈现任何内容,如果已呈现,它将调用驳回它
这样,当用户将选项卡从第三个选项卡切换到任何其他选项卡时,如果第三个选项卡 VC 以模态方式呈现另一个视图控制器,它将在切换选项卡之前关闭它。