关闭模态呈现的视图控制器时的 iOS 黑屏

时间:2021-02-17 12:13:19

标签: ios swift xcode

我有一个 tabbar 控制器,假设如果用户转到第三个选项卡并在第三个视图控制器中,用户按下一个按钮,然后我将视图控制器显示为 modal 。

现在如果用户切换选项卡让说选项卡 1 或 2 而不关闭模态呈现的视图控制器,意味着当他回到选项卡 3 时,用户仍然可以看到模态呈现的视图控制器,现在如果用户关闭这里是模态呈现的视图控制器,然后是黑屏而不是打开模态呈现的视图控制器的视图控制器。

可能的解决方法是我隐藏标签栏控制器,以便用户必须首先关闭以模态呈现的视图控制器。但这不是现在的要求。由于某些原因,我无法隐藏底部标签栏控制器。

请建议我如何执行以下操作

  1. 首先,当用户在打开模态呈现的视图控制器后切换选项卡时,所以当他关闭模态呈现的 vc 时,他必须看到后面的屏幕
  2. 如果第 1 点是不可能的,那么当用户再次返回选项卡 3(他开始模态呈现 VC)时,不应有模态呈现的视图控制器。换句话说,当用户切换选项卡并打开模态呈现的视图控制器时,它必须关闭,然后才能移动到其他选项卡。

1 个答案:

答案 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 子类,您只需在每个 UITabBarControllerDelegateViewController 中将自己设置为 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 以模态方式呈现另一个视图控制器,它将在切换选项卡之前关闭它。

相关问题