IOS标签栏动态标签

use*_*732 5 uitabbarcontroller ios

嗨,我正在开发一个使用标签栏的应用程序.如果用户已登录,则选项卡栏应该有5个选项卡,如果用户已注销,则只有3个选项卡.我的MainAppDelegate.m中有一个if语句,看起来像这样,uid告诉用户是否登录

UIViewController *popular = [[[PopularViewController alloc] initWithNibName:@"PopularViewController" bundle:nil] autorelease];
UIViewController *upcoming = [[[UpcomingViewController alloc] initWithNibName:@"UpcomingViewController" bundle:nil] autorelease];
UIViewController *account = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];
UIViewController *message = [[[MessageViewController alloc] initWithNibName:@"MessageViewController" bundle:nil] autorelease];
UIViewController *more = [[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil] autorelease];
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if([prefs objectForKey:@"uid"]){
    self.tabBarController.viewControllers = @[popular, upcoming, account, message, more];
}else{
    self.tabBarController.viewControllers = @[popular, upcoming, more];
}
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
Run Code Online (Sandbox Code Playgroud)

当用户注销时,我执行以下操作,通过删除帐户和消息将我带到三个选项卡,只有在用户登录时才能看到

NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
[tbViewControllers removeObjectAtIndex:2];
[tbViewControllers removeObjectAtIndex:2];
[self.tabBarController setViewControllers:tbViewControllers];
Run Code Online (Sandbox Code Playgroud)

现在登录的页面越多,如果按下它们就会被带到新的视图控制器进行登录.如果他们成功登录,我会执行以下操作

返回选项卡视图

[[self presentingViewController] dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

然后在viewWillAppear中

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if([prefs objectForKey:@"uid"]){
  NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
  [tbViewControllers removeObjectAtIndex:2];
  UIViewController *account = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];
  UIViewController *message = [[[MessageViewController alloc] initWithNibName:@"MessageViewController" bundle:nil] autorelease];
  UIViewController *more = [[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil] autorelease];
  [tbViewControllers addObject:account];
  [tbViewControllers addObject:message];
  [tbViewControllers addObject:more];
  [self.tabBarController setViewControllers:tbViewControllers];
}
Run Code Online (Sandbox Code Playgroud)

问题是它们已经在更多页面上,因此删除索引2处的对象正在删除更多页面,从而导致应用程序崩溃,即使我看到5个选项卡在崩溃之前显示.所以我的问题是如何在不删除更多标签的情况下将两个标签添加到中间?

感谢您的任何帮助!

use*_*732 0

好吧,我最终将代码移动到第一个选项卡中的 viewWillAppear ,然后当我需要删除选项卡时,我设置所需的变量并以编程方式跳转到第一个选项卡,然后根据需要进行设置,然后以编程方式移回到最后一个选项卡甚至没有实际显示在手机上。

看起来有点黑客,但它有效,但我现在会保持这个问题开放,看看是否有更好的选择,我确信有