iOS开发中Tab Bar Controller相关登出与隐藏返回按钮代码放置问题
问题根因说明
你新增Tab Bar Controller后App的导航栈结构发生了变化,原有代码中对导航控制器的引用失效,才会出现功能不生效的问题。Tab Bar Controller的开发绑定逻辑和普通UIViewController完全一致,不存在特殊规则。
具体解决方案
1. Tab Bar Controller 代码绑定方式
和普通视图控制器操作完全相同:
- 新建Swift文件,类继承自
UITabBarController,示例命名为MainTabBarController.swift - 打开Storyboard,选中你新增的Tab Bar Controller,进入「Identity检查器」面板,将Class属性修改为你刚创建的
MainTabBarController即可 - 后续Tab Bar全局相关的逻辑都可以写在这个类中
2. 登出按钮失效修复
原有代码中navigationController?.popToRootViewController引用的是当前子视图所属的内层导航控制器,不是登录流程所属的外层导航控制器,导致跳转失效。根据你的App结构调整后代码如下:
@IBAction func bottoneLogout(_ sender: UIBarButtonItem) { do { try Auth.auth().signOut() // 改为获取Tab Bar Controller所属的外层导航控制器执行pop self.tabBarController?.navigationController?.popToRootViewController(animated: true) // 如果你登录成功后是直接将Window根视图切换为Tab Bar Controller,用下面的代码切回登录页即可 // UIApplication.shared.windows.first?.rootViewController = 登录页导航控制器实例 } catch let signOutError as NSError { print("Error signing out: %@", signOutError) } }
该IBAction的绑定逻辑不变,你要把它放在哪个子视图控制器中,就和对应控制器的登出按钮绑定即可。
3. 隐藏导航栏Back按钮代码放置规则
根据你的需求选择放置位置:
- 如果你要隐藏的是外层导航栏的Back按钮(也就是Tab Bar Controller左侧的返回按钮):将代码放到你创建的
MainTabBarController的viewDidLoad方法中 - 如果你要隐藏的是Tab下子视图自身导航栏的Back按钮:将代码放到对应子视图控制器的
viewDidLoad方法中 - 如果三个子视图都需要隐藏,可创建一个公共的父视图控制器类,三个子视图都继承该类,只需写一次代码即可
修改后的示例代码:
override func viewDidLoad() { super.viewDidLoad() title = "Grafici" navigationItem.hidesBackButton = true }
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

