Swift4:点击TabBar项时检查用户登录状态失效问题排查
解决TabBar点击MessagesViewController时无法正确识别的问题
我看你遇到的问题是点击TabBar的MessagesViewController项时,代码始终打印"faaaaaaaalse",没法正确识别目标视图控制器。咱们一步步来排查和解决:
最可能的原因:视图控制器被导航控制器包裹了
在iOS开发中,很多时候我们会把TabBar的子控制器放在UINavigationController里,方便后续页面跳转。这时候tabBarController(_:didSelect:)方法返回的viewController其实是导航控制器,而不是你要判断的MessagesViewController,直接用viewController is MessagesViewController自然会返回false。
解决方案:获取导航控制器内的目标控制器
你可以修改判断逻辑,先检查当前选中的控制器是否是导航控制器,如果是,就取它的顶层控制器再做判断:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { // 先处理导航控制器的情况,拿到真正的目标VC let actualViewController = (viewController as? UINavigationController)?.topViewController ?? viewController if actualViewController is MessagesViewController { print("trueee") if UserStorage.id == "" { Toast.toast(messsage: "not loggoed user", view: self.view) } } else { print("faaaaaaaalse") // 可以加一行打印,方便排查当前选中的VC类型 print("当前选中的VC类型:\(type(of: viewController))") } print("Selected view controller") }
额外排查步骤
如果上面的方法还是不行,你可以做这几个检查:
- 查看你的界面结构,确认TabBarController的
viewControllers数组里,对应Messages的项是不是直接是MessagesViewController,还是被包裹在其他容器控制器里 - 打印
viewController的类型,看看输出的类名是什么,明确你实际拿到的是什么控制器 - 确认
UserStorage.id的实现是否正确,比如UserDefaults的键名有没有写错,读取逻辑是否正常(不过这是后续登录判断的问题,先解决VC识别的问题)
另外,你同时实现了UITabBarDelegate的tabBar(_:didSelect:)和UITabBarControllerDelegate的tabBarController(_:didSelect:),这两个方法都会触发,但不会互相影响,不用太担心。
内容的提问来源于stack exchange,提问作者Al-shimaa Adel
相关产品推荐
相关产品推荐

