5

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

然后在视图中会出现

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 个选项卡在崩溃之前显示。所以我的问题是如何在不删除更多选项卡的情况下将两个选项卡添加到中间?

感谢您的任何帮助!

4

2 回答 2

0

如果您查看此链接,您可以找到似乎是解决您的问题的正确途径的示例代码(在“运行时管理选项卡”下)。这是来自您需要的给定链接的信息,为简单起见在此处提供:

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

- (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: 方法为选项卡更改设置动画。

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

希望能帮助到你 ;)

ps 我还没有在代码中验证过这个......

于 2013-06-14T17:28:51.330 回答
0

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

似乎有点骇人听闻,但它有效我会保持这个问题开放,但现在看看是否有更好的选择,我确定有

于 2012-09-29T19:30:40.293 回答