【问题标题】:iOS Tab Bar Dynamic TabsiOS 标签栏动态标签
【发布时间】:2012-09-29 18:03:05
【问题描述】:

您好,我正在开发一个使用标签栏的应用。如果用户已登录,选项卡栏应该有 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 个选项卡在崩溃之前显示。所以我的问题是如何在不删除更多选项卡的情况下将两个选项卡添加到中间?

感谢您的帮助!

【问题讨论】:

    标签: ios uitabbarcontroller


    【解决方案1】:

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

    看起来有点骇人听闻,但它确实有效,但我会暂时保留这个问题,看看是否有更好的选择,我确定有

    【讨论】:

      【解决方案2】:

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

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

      - (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: 方法。

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

      希望对你有帮助;)

      附言我还没有在代码中验证这一点...

      【讨论】:

        猜你喜欢
        • 2018-08-05
        • 1970-01-01
        • 2019-01-04
        • 2020-01-24
        • 2016-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        相关资源
        最近更新 更多