Swift 禁用选项卡控制器中除主页以外的所有按钮

Swift 禁用选项卡控制器中除主页以外的所有按钮,swift,xcode,authentication,uitabbaritem,Swift,Xcode,Authentication,Uitabbaritem,我一直在搜索,似乎找不到如何在用户登录或创建帐户之前禁用除“主页”按钮以外的所有选项卡栏项目 请注意,这是一种黑客方式,因此您可以根据需要进行修改 您将遵守UITABBARCONTROLLEDELEGATE,并使您的VC在viewDidLoad中成为它的代理 if let viewControllers = self.tabBarController?.viewControllers { for viewController in viewControllers {

我一直在搜索,似乎找不到如何在用户登录或创建帐户之前禁用除“主页”按钮以外的所有选项卡栏项目

  • 请注意,这是一种黑客方式,因此您可以根据需要进行修改

  • 您将遵守UITABBARCONTROLLEDELEGATE,并使您的VC在viewDidLoad中成为它的代理

  • if let viewControllers = self.tabBarController?.viewControllers {
    
            for viewController in viewControllers {
    
                if viewController != viewControllers[0] { // assuming your homeViewController index is 0
    
                tabBarController?.tabBarItem.isEnabled = false
    
                }
    
            }
        }
    
  • 然后在“didSelect viewController”委托方法回调中,您将执行逻辑并覆盖所选索引,如下代码所示

  • 注意,如果您在基本VC中执行此步骤,将会更好,并为您节省代码
    • 以下是我的方法

      • 请注意,这是一种黑客方式,因此您可以根据需要进行修改

      • 您将遵守UITABBARCONTROLLEDELEGATE,并使您的VC在viewDidLoad中成为它的代理

      • if let viewControllers = self.tabBarController?.viewControllers {
        
                for viewController in viewControllers {
        
                    if viewController != viewControllers[0] { // assuming your homeViewController index is 0
        
                    tabBarController?.tabBarItem.isEnabled = false
        
                    }
        
                }
            }
        
      • 然后在“didSelect viewController”委托方法回调中,您将执行逻辑并覆盖所选索引,如下代码所示

      • 注意,如果您在基本VC中执行此步骤,将会更好,并为您节省代码

      您可以循环搜索选项卡栏中的所有项目,并禁用所需的项目

              for i in 0..<tabbarController.tabBar.items!.count {
              let item = tabbarController.tabBar.items![i]
              item.isEnabled = i == indexOfHomeTab
          }
      

      对于0中的i..您可以在选项卡栏中循环所有项目并禁用所需的项目

              for i in 0..<tabbarController.tabBar.items!.count {
              let item = tabbarController.tabBar.items![i]
              item.isEnabled = i == indexOfHomeTab
          }
      

      对于0中的i..将其放在viewDidLoad()中的某个位置


      将其放在viewDidLoad()中的某个位置


      您可以执行如下操作,创建一个自定义类(TabBarController),从UITabBarController扩展它,并在TabBarController类中编写代码

      将TabBarController类分配给UITabBarController

      extension TabBarController: UITabBarControllerDelegate{
      func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
          // allow your desired controller to be tapped
          if tabBarController.selectedIndex == indexOfHomeControllerInTabBar {
              return true
          }
          return false
      }
      }
      

      注意:Apple不建议阻止Tabbar,有关更多信息,请查看此链接。

      您可以执行以下操作,创建自定义类(TabBarController),从UITabBarController扩展它,并在TabBarController类中编写代码

      将TabBarController类分配给UITabBarController

      extension TabBarController: UITabBarControllerDelegate{
      func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
          // allow your desired controller to be tapped
          if tabBarController.selectedIndex == indexOfHomeControllerInTabBar {
              return true
          }
          return false
      }
      }
      

      注意:苹果不建议阻止选项卡栏,有关更多信息,请查看此链接。简短的回答可能是“不要这样做”。选项卡栏中的选项卡应允许用户在UI顶层的始终可用屏幕之间切换。如果你阅读苹果的HIG,我想你会发现你正在尝试做的是不被推荐的


      最好让其他屏幕显示某种禁用/非活动状态。

      简短的回答可能是“不要这样做”。选项卡栏中的选项卡应该允许用户在UI顶层的始终可用的屏幕之间切换。如果你阅读苹果的HIG,我想你会发现你正在尝试做的是不被推荐的


      最好让其他每个屏幕都显示某种禁用/非活动状态。

      有时假装用户界面是一种解决方案1)隐藏选项卡2)定义一个类似选项卡的UIView 3)仅为主页按钮或其他视图定义操作只能是图像。小结:定义一个带有一个按钮和图像的假tabbar(UIVİew):@GökhanSayılgan假装用户界面永远不是解决方案。总有一种方法。你不必通过硬编码来完成所有事情-有时假装UI是一种解决方案1)隐藏选项卡2)定义一个看起来像选项卡的UI视图3)仅为主页按钮或其他视图定义操作只能是图像。小结:定义一个带有一个按钮和图像的假tabbar(UIVİew):@GökhanSayılgan假装用户界面永远不是解决方案。总有办法的。你不必通过硬编码来完成所有的事情-_-