hidesBottomBarWhenPushed使用的两种(有更多)时候

本文介绍如何在iOS应用中通过两种方式实现点击导航按钮或TableView Cell时隐藏TabBar,以及如何在返回原界面时恢复显示TabBar的方法。

已经略去部分无关代码,更关注主要内容。

第一种:

点击导航按钮

- (void)viewDidLoad {

    UIBarButtonItem* btn = [[UIBarButtonItem alloc]initWithTitle:@"排版" style:UIBarButtonItemStylePlain target:self action:@selector(btnClick)];

    self.navigationItem.rightBarButtonItem = btn;

}

-(void)btnClick

{

    self.hidesBottomBarWhenPushed  = YES //进入下一个页面后隐藏Tabbar

    [self.navigationController pushViewController:dsvc animated:YES];

}


-(void) viewDidDisappear:(BOOL)animated

{

    self.hidesBottomBarWhenPushed  = NO //进入下一个页面后不隐藏Tabbar

    //这里要详细的解释一下,我自己根据代码流程来解释的

//    1.调用btnClick方法,btnClick执行后会跳转,然后会触发这个方法

//    但是,在btnClick中已经先设置了self.hidesBottomBarWhenPushed  = YES;

//    这是在跳转之前设置的,跳转执行后Tabbar已经隐藏了。

//    然后在调用本方法,这时候就要保证返回到原来的界面的时候Tabbar需要现实出来

//    所以在这里设置了self.hidesBottomBarWhenPushed  = NO;

}


第二种:
点击TableView的Cell

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

    self.hidesBottomBarWhenPushed  = YES //进入下一个页面后隐藏Tabbar

    [self.navigationController pushViewController:pvc animated:YES];

}

-(void) viewDidDisappear:(BOOL)animated

{

    self.hidesBottomBarWhenPushed  = NO //进入下一个页面后不隐藏Tabbar

    //这里要详细的解释一下,我自己根据代码流程来解释的

    //现在有两个典型的情况来触发这个方法

//    2.点击列表的Cell,先触发didSelectRowAtIndexPath,然后再触发本方法

    

}


总结:了解框架代码的执行流程才好分析。



<think>好的,我现在需要帮助用户解决关于hidesBottomBarWhenPushed在视图切换时导致TabBar不显示的问题。用户提到在view1中将这个属性设置为YES,然后在切换到view2之前改回NO,但TabBar仍然不显示。我要仔细分析可能的原因,并给出解决方案。 首先,回忆一下hidesBottomBarWhenPushed的作用。这个属性属于UIViewController,当设置为YES时,在push这个视图控制器的时候会自动隐藏底部的TabBar。通常用于当某个页面需要全屏显示时,隐藏TabBar以腾出空间。但如果在返回时希望TabBar重新显示,需要正确管理这个属性。 用户的情况是,在view1中设置hidesBottomBarWhenPushed为YES,然后在切换到view2之前改回NO,但TabBar没有显示。可能的错误点有几个: 1. **时机问题**:可能在view1的视图已经离开栈之后才更改hidesBottomBarWhenPushed,这时候修改已经无效。因为当view1被push时,系统会根据当时的hidesBottomBarWhenPushed值决定是否隐藏TabBar。如果在view1已经被push之后,再修改这个属性,可能不会影响到当前的导航栈状态。 2. **view2的设置问题**:可能view2自身的hidesBottomBarWhenPushed被设置为YES,导致即使从view1返回,view2仍然隐藏TabBar。需要检查view2的配置。 3. **导航控制器交互问题**:可能在使用UINavigationController时,多个视图控制器的hidesBottomBarWhenPushed属性相互影响。例如,如果view1隐藏了TabBar,而view2没有正确设置,可能导致TabBar无法恢复。 4. **动画或状态未更新**:可能在切换视图时,没有正确触发界面更新,导致TabBar状态未及时刷新。 接下来,我需要逐步分析每个可能性,并提供对应的解决方法。 首先,检查view1中设置hidesBottomBarWhenPushed的时机。正确的做法是在view1被push之前设置这个属性,而不是在view1内部设置。例如,在跳转到view1的代码中,先设置view1的hidesBottomBarWhenPushed为YES,然后执行push操作。这样系统在push时会处理TabBar的隐藏。如果用户是在view1的viewDidLoad或其他生命周期方法中设置这个属性,可能已经太晚,因为push操作已经完成,此时修改可能不会生效。 其次,当从view1返回到上一个视图控制器(比如切换到view2),需要确保在view1被pop时,hidesBottomBarWhenPushed已经被正确设置为NO。不过,实际上,当view1被pop时,系统应该自动恢复上一个视图控制器的TabBar显示状态,前提是上一个视图控制器(比如view2)没有设置hidesBottomBarWhenPushed为YES。因此,问题可能出在view2本身是否被正确配置。 另外,如果用户在切换到view2之前,即pop view1时,手动将view1的hidesBottomBarWhenPushed设置为NO,这可能没有效果,因为此时view1已经被移出导航栈,对它的属性修改不会影响当前显示的视图控制器。正确的做法是确保在push view1之前设置其hidesBottomBarWhenPushed为YES,而view2的hidesBottomBarWhenPushed应该保持默认的NO,或者根据需要进行设置。 可能的解决方案步骤: 1. **确保在push view1之前设置其hidesBottomBarWhenPushed为YES**: 在跳转到view1的地方(比如在之前的视图控制器中),设置view1的该属性,再执行push。 ```swift let view1 = View1Controller() view1.hidesBottomBarWhenPushed = true navigationController?.pushViewController(view1, animated: true) ``` 2. **检查view2的hidesBottomBarWhenPushed设置**: 确保view2的该属性为NO(默认值),或者在push view2时没有设置为YES。 3. **避免在view1的生命周期方法中动态修改该属性**: 如果用户是在view1的viewWillDisappear或其他方法中设置hidesBottomBarWhenPushed为NO,可能已经来不及影响导航控制器的行为。 4. **使用导航控制器的delegate方法**: 可以尝试在导航控制器的代理方法中管理TabBar的显示,但这可能复杂一些。 如果用户已经按照正确的时机设置属性,但问题仍然存在,可能需要进一步检查是否有其他代码影响了TabBar的可见性,比如自定义的TabBar控制器、手动修改了TabBar的hidden属性,或者在转场动画中出现了问题。 另外,可能需要注意iOS版本的问题,不同版本的系统在处理hidesBottomBarWhenPushed时可能有差异,但这种情况相对少见。 总结,用户的问题很可能是因为在错误的时机修改了hidesBottomBarWhenPushed属性,或者view2本身也有隐藏TabBar的设置。需要指导用户检查这些关键点,并正确配置属性。</think>针对`hidesBottomBarWhenPushed`在视图切换时**TabBar未正常显示**的问题,以下是逐步分析与解决方案: --- ### **问题根源分析** 1. **属性设置时机错误** - `hidesBottomBarWhenPushed`需在**push操作前**设置,而非在控制器内部(如`viewDidLoad`)动态修改。 - 若在`view1`已被push后再修改此属性,系统不会自动更新导航栈状态。 2. **目标控制器`view2`的配置问题** - `view2`自身的`hidesBottomBarWhenPushed`可能被设为`YES`,导致其显示时仍隐藏TabBar。 3. **导航栈状态冲突** - 多个控制器间的属性设置可能互相干扰(如`view1`隐藏TabBar后,`view2`未能正确恢复)。 --- ### **解决方案** #### 步骤1:正确设置`hidesBottomBarWhenPushed` - **在push`view1`前直接设置属性**(而非在`view1`内部): ```swift // Swift示例(在跳转代码处) let view1 = View1Controller() view1.hidesBottomBarWhenPushed = true // 确保在此处设置 navigationController?.pushViewController(view1, animated: true) ``` #### 步骤2:检查`view2`的配置 - 确认`view2`的`hidesBottomBarWhenPushed`为默认值`NO`: ```swift // 确保view2未主动隐藏TabBar let view2 = View2Controller() view2.hidesBottomBarWhenPushed = false // 默认即为false,可省略 ``` #### 步骤3:避免在生命周期方法中动态修改 - **不要在`view1`的`viewWillDisappear`等方法中修改此属性**,此时已无法影响导航栈行为。 #### 步骤4:检查自定义TabBar或导航控制器 - 若使用自定义`UITabBarController`或`UINavigationController`,确保未手动设置`tabBar.isHidden`,避免与系统行为冲突。 --- ### **验证流程** 1. 从`RootVC`(带TabBar)push`view1`,设置`hidesBottomBarWhenPushed = YES` → TabBar应隐藏。 2. 从`view1`返回到`RootVC`(如pop操作) → TabBar应自动显示。 3. 从`RootVC`push`view2`(保持其`hidesBottomBarWhenPushed = NO`) → TabBar应始终可见。 --- ### **常见错误排查** - **场景复现**:从`view1`返回到`view2`时TabBar不显示 - **原因**:`view2`可能在push时被错误设置为`hidesBottomBarWhenPushed = YES`。 - **解决**:检查`view2`的初始化代码,确保未主动修改此属性。 - **动画干扰** - 若使用自定义转场动画,需在`transitionCoordinator`中同步TabBar状态: ```swift transitionCoordinator?.animate(alongsideTransition: { _ in self.tabBarController?.tabBar.isHidden = false }) ``` --- ### **总结** 关键点在于**属性设置的时机**和**目标控制器的正确配置**。确保`hidesBottomBarWhenPushed`仅在需要隐藏TabBar的控制器push前设置为`YES`,其他情况保持默认即可。若问题依旧,建议检查导航栈中所有控制器的属性及自定义UI组件的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值