在需要时从视图控制器显示/隐藏标签栏

Posted

技术标签:

【中文标题】在需要时从视图控制器显示/隐藏标签栏【英文标题】:show/hide the tabbar when needed from a view controller 【发布时间】:2012-02-06 11:24:33 【问题描述】:

我是 ios 编程新手。我真的需要你的帮助。

我有一个登录屏幕,可将我带到地图(谷歌 API)。单击任何创建的注释时,我想加载一个带有 2 个视图的标签栏。

我搜索并发现我需要在开始时添加标签栏,即 appdelegate 并在需要时显示/隐藏标签栏。

所以我做了 2 个函数来显示和隐藏标签栏

-(void)Load_tabBar
[self.navigationController.view removeFromSuperview];
[self.window addSubview:tabBarController.view];
[self.window makeKeyWindow];

-(void)remove_tabBar
self.tabBarController.selectedIndex=0;
[self.tabBarController.view removeFromSuperview];
[self.window addSubview:navigationController.view];
[self.window makeKeyWindow];

当我调用 Load_tabBar 方法时它确实有效,当我点击返回时它调用 remove_tabBar 方法。如果我再次调用 Load_tabBar 方法并返回,它会崩溃并给出错误

-[UILayoutContainerView 窗口]:消息发送到已释放实例 0x563b0b0

已编辑:PS:我可以将标签栏视图添加到视图控制器然后推送该视图吗?

thnx

【问题讨论】:

【参考方案1】:

使用这个self.hidesBottomBarWhenPushed = YES;

【讨论】:

我可以将标签栏视图添加到视图控制器然后推送该视图吗? 当您在该呈现视图控制器中推送视图控制器时,您必须在 viewWillAppear 方法中添加它。无需使用您的代码 最好在前一个视图控制器的 prepareForSegue 方法中使用它。【参考方案2】:

这种方法绝对有效。你只需要在 push 之前把它放在方法中,像这样:

-actionThatPushTheViewController  

    //create the view controller here, do some init. 

    //then:
    theViewControllerToBePushed.hidesBottomBarWhenPushed = YES;

    //push it here like this: 
    [self.navigationController pushViewController:theViewControllerToBePushed animated:YES];

【讨论】:

【参考方案3】:

希望这两种方法对你有帮助,

- (void) hideTabBar:(UITabBarController *) tabbarcontroller 

int height = 480;

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];

for(UIView *view in tabbarcontroller.view.subviews) 
    if([view isKindOfClass:[UITabBar class]]) 
        [view setFrame:CGRectMake(view.frame.origin.x, height, view.frame.size.width, view.frame.size.height)];
     
    else 
        [view setFrame:CGRectMake(view.frame.origin.x,view.frame.origin.y, 320, 436)];
    

[UIView commitAnimations];

- (void) showTabBar:(UITabBarController *) tabbarcontroller 

int height = 480;

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3]; 

for(UIView *view in tabbarcontroller.view.subviews) 

    if([view isKindOfClass:[UITabBar class]]) 
        [view setFrame:CGRectMake(view.frame.origin.x, height, view.frame.size.width, view.frame.size.height)];            
     
    else 
        [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, height)];
    
    

[UIView commitAnimations];

只需将这两个方法放在 AppDelegate 类中,然后根据您的要求在需要的地方调用它。

【讨论】:

我不想改变子视图的帧大小..弹出时,它完全弹出到另一个视图..子视图也消失了 似乎运行良好,我添加了一些调整来处理 iPhone 和 iPad。我得到窗口的宽度和高度,就像这样 float height = self.window.frame.size.height;浮动宽度 = self.window.frame.size.width;【参考方案4】:

如果你想在推送时隐藏它并在弹出时显示它是代码:

if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondVC") as? SecondVC 
    if let navigator = navigationController 
        viewController.hidesBottomBarWhenPushed = true
        navigator.pushViewController(viewController, animated: true)
    

【讨论】:

以上是关于在需要时从视图控制器显示/隐藏标签栏的主要内容,如果未能解决你的问题,请参考以下文章

隐藏标签栏控制器

模态视图控制器隐藏标签栏

推/回时隐藏/显示标签栏。迅速

完全显示/隐藏标签栏控制器并使用空间

单击隐藏选项卡视图控制器中的后退按钮时如何显示选项卡

隐藏在标签栏控制器标签栏旁边的 iPhone 视图