You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS Tab Bar Controller中Braintree Drop-in UI切换标签页黑屏问题求助

嘿,我之前也碰到过Braintree Drop-in UI和TabBarController搭配的类似问题,你的思路完全正确——切换标签页时自动关闭Drop-in就是最直接解决视图变黑问题的方案。下面给你两种实用的实现方式,你可以根据自己的代码结构来选:

方法一:通过TabBarController代理监听标签切换

如果你的项目用了自定义的TabBarController,直接在里面监听标签选中事件,一旦切换就检查并关闭Drop-in:

class CustomTabBarController: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self // 设置代理
    }
}

extension CustomTabBarController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        // 先检查TabBarController本身是否弹出了Drop-in
        if let dropInVC = tabBarController.presentedViewController as? BTDropInController {
            dropInVC.dismiss(animated: true, completion: nil)
        }
        
        // 额外检查所有子控制器,防止Drop-in是从子VC弹出的情况
        for childVC in tabBarController.viewControllers ?? [] {
            if let dropInVC = childVC.presentedViewController as? BTDropInController {
                dropInVC.dismiss(animated: true, completion: nil)
            }
        }
    }
}
方法二:在弹出Drop-in的ViewController中监听视图消失

如果Drop-in只在某个特定的子ViewController中弹出,那可以在这个VC的生命周期方法里处理,当视图即将消失(切换标签页会触发这个方法)时自动关闭Drop-in:

class PaymentVC: UIViewController {
    // 持有Drop-in控制器的引用,方便后续关闭
    private var dropInController: BTDropInController?

    // 你的弹出Drop-in的方法
    func presentBraintreeDropIn() {
        let request = BTDropInRequest()
        dropInController = BTDropInController(authorization: "你的ClientToken", request: request) { [weak self] controller, result, error in
            // 处理支付结果回调
            controller.dismiss(animated: true) {
                self?.dropInController = nil // 释放引用,避免内存泄漏
            }
        }
        present(dropInController!, animated: true)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // 检查Drop-in是否还在显示,如果是就关闭它
        if let dropIn = dropInController, dropIn.isBeingPresented == false && dropIn.presentingViewController != nil {
            dropIn.dismiss(animated: true) {
                self.dropInController = nil
            }
        }
    }
}
注意事项
  • 记得在回调和dismiss完成后把dropInController置为nil,避免循环引用和内存泄漏
  • 如果用第一种方法,确保TabBarController的delegate已经正确设置,系统默认的TabBarController也可以在AppDelegate/SceneDelegate里设置代理
  • 测试时要覆盖所有可能切换标签页的场景(比如点击TabBar、滑动切换),确保Drop-in都能正常关闭

内容的提问来源于stack exchange,提问作者Paweł Zgoda-Ferchmin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:05:34