2012-09-29 163 views
3

嗨我正在使用一个标签栏的应用程序。如果用户登录,则标签栏应该有5个选项卡,但如果用户登出,则标签栏应该只有3个。我在我的MainAppDelegate.m if语句看起来像这样在那里,如果用户登录或UID告诉不IOS标签栏动态标签

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个选项卡显示出来之前它崩溃。所以我的问题是我怎样才能将两个标签添加到中间而不删除更多的选项卡?

谢谢你的帮助!

回答

0

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

似乎有点两轮牛车,但它的作品,我会继续为这个问题的开放,虽然现在看是否有更好的选择,我相信有

0

如果你看一看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:方法更改为 。

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

希望它有帮助;)

p.s.我没有在代码中验证这一点...