Swift 3中如何移除CometChat嵌入的UITabBar/Storyboard视图
解决CometChat嵌入视图无法关闭的问题
兄弟,卡4天确实闹心!你之前的思路是隐藏原有视图,但问题出在CometChat大概率不是作为你原有rootVC的subview存在的——它要么是创建了自己独立的UIWindow,要么是通过模态/子VC的方式添加了新的视图层级,所以你操作原有rootVC的视图根本碰不到它。
下面给你几个靠谱的解决方向,按优先级来:
1. 优先用CometChat官方提供的关闭API
第三方框架一般都会自带对应的关闭方法,这是最安全的方式,不会留下内存泄漏问题。你可以去查CometChat的文档,找类似这样的方法:
// 示例,具体以官方文档为准 CometChat.dismissChat() // 或者如果是某个具体的VC实例,调用它的dismiss方法 cometChatVC.dismiss(animated: true, completion: nil)
如果找不到文档,也可以试试在代码里搜CometChat类的相关方法,比如dismiss、close这类关键词。
2. 手动查找并移除CometChat的窗口/视图
如果官方方法实在找不到,就手动定位它的层级:
情况A:CometChat创建了独立的UIWindow
iOS中每个窗口都是独立的层级,你可以遍历所有窗口,找到属于CometChat的那个然后隐藏/移除:
// iOS 13+ 要考虑Scene的情况,遍历所有场景的窗口 UIApplication.shared.connectedScenes.forEach { scene in guard let windowScene = scene as? UIWindowScene else { return } windowScene.windows.forEach { window in // 通过rootViewController的类名判断(替换成CometChat实际的VC类名) if window.rootViewController is CometChatConversationViewController { window.isHidden = true // 彻底移除的话可以设置window.rootViewController = nil,或者从场景中移除 } } }
情况B:CometChat作为子VC添加到原有rootVC中
如果它是通过addChildViewController添加的,就遍历原有rootVC的子VC,找到后移除:
guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { return } for childVC in rootVC.children { // 同样通过类名判断 if childVC is CometChatViewController { childVC.willMove(toParent: nil) childVC.view.removeFromSuperview() childVC.removeFromParent() break } }
为什么你之前的方法没用?
你之前的代码是隐藏原有rootVC的subviews或者原有window的rootVC视图,但CometChat的视图是在新的层级上——要么是覆盖在原有窗口上的新窗口,要么是添加在原有VC之上的子VC,所以你的操作根本没触碰到它的视图。
最后提醒下,尽量用官方方法,手动移除的话记得测试内存泄漏,避免留下隐患!
内容的提问来源于stack exchange,提问作者Shoogarh
相关产品推荐
相关产品推荐

