self.title和self.navigationItem.title以及self.tabBarItem.title的理解

本文深入探讨了SwiftUI在iOS开发中的应用,讲解了如何利用SwiftUI构建界面,以及其与Objective-C和Swift等语言的集成。同时,还介绍了Xcode在iOS开发中的角色,以及如何使用Kotlin进行Android开发,对比iOS与Android开发的异同。

转载自: https://my.oschina.net/wayzhu/blog/1812942

self.title = "" self.navigationItem.title = "" self.tabBarItem.title = "" 没有tabBar设置self.Title 那么就是该页面的标题同navigationItem.title 当有tabBar时,不设置navigationItem.title设置self.Title,此时tabBarItem.title就等于self.Title也等于标 题;当设置了navigationItem.title并且设置了self.Title,那么该页面的标题就等于navigationItem.title,tabBarItem.title 等于self.title

重新来,现在文件的类是class MainModuleTabBarController: UITabBarController { message只是下方按钮三个中的一个,点击后跳转到message相关页面。 这是其中message跳转相关的代码: |private func buildMessageNavi() -> BaseSplitViewController { // 创建分栏视图控制器 let splitVC = BaseSplitViewController() // 创建左侧分栏的主视图控制器(通知菜单) let messageVC = UIStoryboard(name: MessageStoryboardName, bundle: nil).instantiateViewController(withIdentifier: MessageHomeVCStoryboardId) let masterVC = messageVC let detailVC = MessageCenterMessageListViewController() // 用导航控制器包装主视图详情视图 let masterNavi = BaseNavigationController(rootViewController: masterVC) let detailNavi = BaseNavigationController(rootViewController: detailVC) // 设置分栏视图控制器的视图控制器数组 splitVC.viewControllers = [masterNavi, detailNavi] // 配置分栏视图控制器 splitVC.preferredDisplayMode = .primaryOverlay // 设置主视图宽度为50% if #available(iOS 11.0, *) { // iOS 11+ 推荐方法 splitVC.preferredPrimaryColumnWidthFraction = 0.4 splitVC.maximumPrimaryColumnWidth = .greatestFiniteMagnitude } else { // iOS 8-10 兼容方案 splitVC.minimumPrimaryColumnWidth = UIScreen.main.bounds.width * 0.4 splitVC.maximumPrimaryColumnWidth = UIScreen.main.bounds.width * 0.4 } //设置底部的tabBarItem let msgItemImg = TPImageLiteral("tabbar_message_nor") let msgItemSelectedImg = TPImageLiteral("tabbar_message_act") splitVC.tabBarItem.setData(LocalizedString(key: tabbarItemMessage), msgItemImg, msgItemSelectedImg) // messageNavi.tabBarItem.setTitleColor(UIColor(hexString: tabBarItemTitleColor), UIColor.tpbPrimary) return splitVC } private func buildMineNavi() -> BaseNavigationController { let mineVC = UIStoryboard(name: MineStoryboardName, bundle: nil).instantiateViewController(withIdentifier: MineHomeVCStoryboardId) let mineNavi = BaseNavigationController(rootViewController: mineVC) let mineItemImg = TPImageLiteral("tabbar_mine_nor") let mineItemSelectedImg = TPImageLiteral("tabbar_mine_act") mineNavi.tabBarItem.setData(LocalizedString(key: tabbarItemMine), mineItemImg, mineItemSelectedImg) // mineNavi.tabBarItem.setTitleColor(UIColor(hexString: tabBarItemTitleColor), UIColor.tpbPrimary) return mineNavi }
10-17
这个方法 `- (void)tpbSetupInitialData` 是页面初始化数据的入口方法,通常由 `TPBCommonTableController` 提供的生命周期流程调用,用于设置页面所需的初始数据。从实现来看,它主要完成了 **页面标题设置** **分类流量数据的初始化赋值**。 --- ## 🧠 一、方法功能详解 ```objc - (void)tpbSetupInitialData { [super tpbSetupInitialData]; self.navigationItem.title = gMeshQuickSetup.sdnStaticsTrafficCategories; self.selectCategoryTrafficList = self.selectCategoriesInfo.categoryTraffics.mutableCopy; self.categoryTrafficList = self.categoriesInfo.categoryTraffics.mutableCopy; } ``` ### ✅ 1. 调用父类初始化方法 ```objc [super tpbSetupInitialData]; ``` - 表示调用父类 `TPBCommonTableController` 的数据初始化逻辑; - 父类可能在此方法中完成了通用的数据初始化、配置、状态恢复等操作; - 子类在此基础上进行扩展。 --- ### ✅ 2. 设置页面标题 ```objc self.navigationItem.title = gMeshQuickSetup.sdnStaticsTrafficCategories; ``` - `gMeshQuickSetup` 是一个全局配置或语言包对象; - `sdnStaticsTrafficCategories` 可能是多语言支持的字符串,表示“流量分类统计”之类的标题; - 这一步完成了页面导航栏标题的设置。 --- ### ✅ 3. 初始化选中分类流量数据列表 ```objc self.selectCategoryTrafficList = self.selectCategoriesInfo.categoryTraffics.mutableCopy; ``` - `selectCategoriesInfo` 是页面传入的当前选中分类数据对象; - `categoryTraffics` 是其内部的流量分类列表; - 使用 `mutableCopy` 创建可变副本,用于后续动态更新(如点击切换选中状态)。 --- ### ✅ 4. 初始化所有分类流量数据列表 ```objc self.categoryTrafficList = self.categoriesInfo.categoryTraffics.mutableCopy; ``` - `categoriesInfo` 是页面传入的所有分类数据对象; - 同样取出其内部的 `categoryTraffics` 列表并复制为可变数组; - 用于作为完整数据源,供后续筛选、比较、展示使用。 --- ## 🚨 二、与你之前 bug 的关联分析 你之前的问题描述是: > “categories 超过 15 个时,不使用全选取消全选按钮,无法取消选中被默认选中的类型。” 结合当前方法,可以得出以下几点关键信息: | 分析点 | 说明 | |--------|------| | ✅ 默认选中逻辑 | 当前方法中并没有直接设置“默认选中”逻辑,但 `selectCategoryTrafficList` 初始值是 `selectCategoriesInfo` 中的数据,可能在传入时就默认选中了所有分类 | | 📦 数据一致性 | `selectCategoryTrafficList` `categoryTrafficList` 是两个独立的数组,如果后续操作没有正确同步两者状态,可能导致 UI 与数据不一致 | | 🧩 可变性 | 使用 `mutableCopy` 是合理的,确保后续操作可以修改数组内容(如点击取消选中) | --- ## 🛠 三、建议排查点 | 检查项 | 建议排查方式 | |--------|--------------| | 默认选中逻辑 | 查看 `selectCategoriesInfo` 是否在上层页面中默认选中了所有分类 | | 数据绑定 | 查看 cell 是否根据 `selectCategoryTrafficList` 显示选中状态 | | 点击事件 | 查看 `tableView:didSelectRowAtIndexPath:` 是否实现了点击切换选中状态的逻辑,并更新 `selectCategoryTrafficList` | | UI 控件 | 查看是否只对前 15 个分类显示了“取消选中”控件,导致其他分类无法交互 | --- ## ✅ 四、总结:这个方法是做什么的? | 功能 | 描述 | |------|------| | 📋 页面初始化 | 设置导航栏标题 | | 📊 数据初始化 | 初始化两个分类流量数据源:所有分类选中分类 | | 📥 数据来源 | 从 `selectCategoriesInfo` `categoriesInfo` 中提取数据 | | 📅 调用时机 | 在页面加载初期调用,通常在 `viewDidLoad` 之后 | | 🚨 问题可能点 | 默认选中未解除、数据源未更新、cell 未绑定选中状态 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值