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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:48:39