IOS标签栏动态标签

时间:2012-09-29 18:03:05

标签: ios uitabbarcontroller

嗨,我正在开发一个使用标签栏的应用。如果用户已登录,则选项卡栏应该有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];

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

NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
[tbViewControllers removeObjectAtIndex:2];
[tbViewControllers removeObjectAtIndex:2];
[self.tabBarController setViewControllers:tbViewControllers];

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

返回标签视图

[[self presentingViewController] dismissModalViewControllerAnimated:YES];

然后在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];
}

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

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

似乎有点hackery但它的确有效我现在仍然会打开这个问题,看看是否有更好的选择我确定有

答案 1 :(得分:0)

如果您查看this link,您可以找到解决问题的正确途径的示例代码(在#34;在运行时管理选项卡")。这是您需要的给定链接的信息的和平,为简单起见,此处提供:

  

...删除当前所选标签的方法   响应同一选项卡中特定按钮的点击。这个方法是   由视图控制器为选项卡实现。你可能会用   如果你想删除一个标签,你自己的代码中的类似的东西   不再需要。例如,您可以使用它来删除选项卡   包含一些只需输入一次的用户特定数据。

- (IBAction)processUserInformation:(id)sender
{
   // Call some app-specific method to validate the user data.
   // If the custom method returns YES, remove the tab.
   if ([self userDataIsValid])
   {
      NSMutableArray* newArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers];
      [newArray removeObject:self];

      [self.tabBarController setViewControllers:newArray animated:YES];
   }
}

并注意(仅为答案完整性):

  

...如果您以可能看到的方式添加或删除标签   在用户中,您可以使用选项卡对选项卡更改进行动画处理   setViewControllers:animated:method。

因此,考虑到这一点,您可以创建登录视图控制器并将其添加到选项卡栏控制器。然后以编程方式选择该登录选项卡(并隐藏选项卡栏本身),最后使用提供的方法添加/删除所需的选项卡,并从其自己的视图控制器中删除登录选项卡本身(如图所示)码)。

希望它有所帮助;)

P.S。我还没有在代码中验证这一点......