【问题标题】:How to hide tabs in tabBarController dynamically in swift 3如何在 swift 3 中动态隐藏 tabBarController 中的选项卡
【发布时间】:2017-08-22 09:15:17
【问题描述】:

我正在使用 UITabBarController 并使用情节提要中的关系 segue 添加选项卡。

如何根据登录的用户角色隐藏特定的标签?

【问题讨论】:

  • 你能详细说明这个问题吗?您可能还需要添加到目前为止您尝试过的代码 sn-p...

标签: ios swift uitabbarcontroller uitabbar ios11


【解决方案1】:

好问题!

你需要挖掘UITabbarController及其成员(属性+函数)

现在,专注于这些步骤来寻找解决方案:

  1. 您可以使用 Segue 关联的视图控制器创建任意数量的标签栏(项目)。使用故事板中的 segue 将所有视图控制器与标签栏(控制器)连接起来。
  2. 现在,关于UITabbarController:它有一个属性(变量)viewControllers(它是一个 UIViewController 数组),用于存储使用 UITabbar 项关联的 Tabbar Controller 的 UIViewController。
  3. 您需要在设备的永久存储(如UserDefaultsCoreData、....)中存储一个指示用户登录状态的值。
  4. 当您的应用程序启动时,从存储中检索/获取该值(用户登录状态)并将其用于 UITabbarController 上的进一步操作。
  5. 现在关注第 2 步:使用属性“viewControllers”以编程方式从标签栏控制器获取所有视图控制器,并将其存储在单独的变量中。
  6. 数组中视图控制器的交换/交换/更新位置(索引)(您也可以根据您的要求(登录状态)删除或插入视图控制器)并将相同的数组(变量)重新分配给标签栏的viewControllers 属性控制器。

这是应用程序启动的示例:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    if var tabController = self.window?.rootViewController as? UITabbarController, var viewControllers = tabController.viewControllers {

       let isLoggedIn = <get value from your data storage as bool>

       if  isLoggedIn {
           viewControllers.remove(at: firstIndex)  // By considering you need to remove view controller at index first. It will automatically remove tab from tabbar also.
           tabController.viewControllers = viewControllers
           self.window?.rootViewController = tabController
           // further operations to make your root controller visible....
       }

   }

}

【讨论】:

  • 如何初始化窗口?抱歉,我是 ios 新手,[stackoverflow.com/questions/28384321/… 也提到了这个链接,但它不起作用
  • 在我的代码中 - self.window?AppDelegate 的属性。你不需要初始化它。只需从情节提要创建您的标签栏控制器。从情节提要中将主情节提要和根控制器作为标签栏分配给您的项目。此代码自动工作。
  • 我以 root 控制器登录。用户成功登录,然后 TabBarController 已打开。我已经从 storyBoard 添加了 TabBarController 中的所有选项卡,并且工作正常。现在我想根据用户角色显示和隐藏视图控制器(我在登录响应中从服务器获取)
  • 来自服务器的响应-“featuresAction”:“[{\”Frature1\”:[\”View\”]},{\”Frature2\”:[\”View\”]}, {\"Frature3\":[\”View\"]},{\"Frature4\”:[\”View\"]},{\"Frature5\”:[\”View\"]}]" 这个是响应,我想根据功能列表(我从服务器获得)隐藏标签
  • TabBarControllers: 。 //Frature2 . //Frature3 。 //Frature4
【解决方案2】:

如果您想从标签栏控制器中删除标签,请执行以下操作(当您的用户未登录时)

NSInteger indexToRemove = 0;
NSMutableArray *tabs = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
[tabs removeObjectAtIndex:indexToRemove];
self.tabBarController.viewControllers = tabs;

当您的用户登录时

UIViewController *viewController = [[UIViewController alloc] init];
NSMutableArray *tabs = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
[tabs addObject:viewController];
self.tabBarController.viewControllers = tabs;

斯威夫特版

删除标签

let indexToRemove = 0
if var tabs = self.tabBarController?.viewControllers {
  tabs.remove(at: indexToRemove)
  self.tabBarController?.viewControllers = tabs
} else {
  print("There is something wrong with tabbar controller")
}

添加标签

let indexToAdd = 2
let vc = UIViewController.init()
if var tabs = self.tabBarController?.viewControllers {
  tabs.append(vc) // Append at last index of array
  // tabs.insert(vc, at: indexToAdd)  // Insert at specific index
  self.tabBarController?.viewControllers = tabs
} else {
  print("There is something wrong with tabbar controller")
}

【讨论】:

  • 你能告诉我是什么问题造成的吗?
  • 在删除选项卡代码中,第二行出现错误为 EXC_BAD_INSTRUCTION(EXC_1386_INVOP,subcode=0*0)
  • @ShubhangiShedage 请检查我的编辑,抱歉我没有测试我的代码。
  • @PratikJamariya,亲爱的,不要强行打开标签栏控制器的视图控制器。这可能会导致应用程序崩溃(self.tabBarController?.viewControllers)!。尝试if-let以防止应用崩溃。
  • @Krunal 请随时编辑我的答案,我不擅长 swift,但我的 Objective-C 技能非常好。
猜你喜欢
  • 1970-01-01
  • 2017-09-03
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多