如何从视图中删除两个标签栏相互重叠的标签栏?

Posted

技术标签:

【中文标题】如何从视图中删除两个标签栏相互重叠的标签栏?【英文标题】:How to remove a tab bar from view having two tab bars on top of each other? 【发布时间】:2019-05-21 09:05:36 【问题描述】:

我想从 A 屏幕中删除黑色标签栏。我尝试执行下面的代码来筛选,但它删除了白色的。

override func viewDidLoad() 
        super.viewDidLoad()
        self.tabBarController?.tabBar.isHidden = true

    

【问题讨论】:

为什么使用嵌套的 UITabBarController? 为 UITabBarController 创建了一个自定义类并隐藏了你需要的类 一般标签栏是用来管理一些 UIViewController 实例的,那你为什么要尝试用另一个 UITabBarController 实例来管理 UITabBarController 实例呢?请告诉我你到底想做什么? 在你的情况下很有趣,结果可能是self.tabBarController?tabBarController?.tabBar.isHidden = true,因为你的标签栏控制器有一个标签栏控制器,你想隐藏它的标签栏。但正如其他人建议的那样,您可能应该重新考虑您的视图控制器层次结构,并在您的情况下避免使用 2 个选项卡栏控制器,或者尝试在按下该选项卡时显示第二个选项卡栏控制器。 @omartarek32 一旦按下第一个选项卡中的项目,我想在选项卡栏中显示 A 屏幕和蓝色屏幕。 【参考方案1】:

在我看来,这对 ios 用户来说不是一个好的用户体验,但无论如何请尝试以下方法,它会适合你

1- 首先构建尝试在您的 stroyboard 中构建以下层次结构

请注意,灰色视图控制器不是UITabBarController,它只是一个UIViewController,但它包含一个UITabBar 对象

2- 你需要给红色视图控制器stroyboard id "RedViewController" 并且还要给蓝色视图控制器"BlueViewController"

3- 为名为“Favorite”的第一个 UITabBarItem 提供嵌套的UITabBarItem tag 0,并为名为“more”的第二个 UITabBarItem 提供 tag 1 p>

4- 最后将以下类添加到具有UITabBar 对象的UIViewController,在我们的示例中它将是灰色视图控制器

class SecondViewController: UIViewController 

lazy var blueViewController: UIViewController? = 
    self.storyboard?.instantiateViewController(withIdentifier: "BlueViewController")
()

lazy var redViewController: UIViewController? = 
    self.storyboard?.instantiateViewController(withIdentifier: "RedViewController")
()

@IBOutlet weak var containerView: UIView!
@IBOutlet weak var nestedTabBar: UITabBar!
override func viewDidLoad() 
    super.viewDidLoad()
    nestedTabBar.delegate = self
    addRedViewController()
    self.nestedTabBar.selectedItem = self.nestedTabBar.items?.first


func addBlueViewController() 

    if let redViewController = redViewController 
        redViewController.willMove(toParent: nil)
        redViewController.view.removeFromSuperview()
        redViewController.removeFromParent()
    

    if let blueViewController = blueViewController 
        addChild(blueViewController)
        blueViewController.view.frame = containerView.frame
        containerView.addSubview(blueViewController.view)
        blueViewController.didMove(toParent: self)
    


func addRedViewController() 

    if let blueViewController = blueViewController 
        blueViewController.willMove(toParent: nil)
        blueViewController.view.removeFromSuperview()
        blueViewController.removeFromParent()
    

    if let redViewController = redViewController 
        addChild(redViewController)
        redViewController.view.frame = containerView.frame
        containerView.addSubview(redViewController.view)
        redViewController.didMove(toParent: self)
      
  


extension SecondViewController: UITabBarDelegate 

func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) 

    if item.tag == 0 
        addRedViewController()
     else 
        addBlueViewController()
    
  

【讨论】:

谢谢。在深入了解它之后,我会尽量避免它。 不客气,如果您在该解决方案中遇到任何问题,请在此处发表评论【参考方案2】:
tabBarController?.parent?.tabBarController?.tabBar.isHidden = true

施展魔法,但您必须确保调用了 viewDidLoad。

【讨论】:

以上是关于如何从视图中删除两个标签栏相互重叠的标签栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从标签栏控制器卸载视图控制器?

从模态视图关闭的标签栏项目中删除选择图像

从标签栏视图中的视图中关闭模式

我在应用程序委托中加载的视图控制器(在导航控制器中)与标签栏重叠

如何在 SwiftUI 中删除主要内容视图和标签栏之间的间距?

由于标签栏挡住了单元格,如何设置表格视图单元格的位置?