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
相关产品推荐
相关产品推荐

