2012-02-25 17 views
1

我有一个带有6到7个选项卡的tabbar控制器,允许自定义(意味着用户可以更改选项卡栏的显示顺序)。并且选项卡1,3,5,7要求用户在查看视图中的任何内容之前先登录访问权限。iOS - 在UITabBarControler最佳实践中登录视图

我不知道如何识别哪个tabbar需要登录访问(我们可以创建@protocal或其他东西)。用户登录成功后。我不知道如何选择用户触摸过的最后一个tabbar。

我使用的appdelegate在AppDelegate中

-(BOOL)tabBarController:(UITabBarController *)aTabBar shouldSelectViewController:(UIViewController *)viewController { 

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
BOOL hasValidLogin = [standardUserDefaults boolForKey:@"hasValidLogin"]; 


if (hasValidLogin == NO && /* I don't know to find a controller which requires login access*/) { 
    [LoginView showModal:viewController delegate:self]; 
    return NO; 
} 
return YES; 
} 

编译标志confiming到UITabBarControllerDelegate - 编译标志LoginDelegate方法 -

-(void)loginViewController:(LoginView *)loginViewController didLoginSuccess:NSString *)userName { 
NSLog((@"%s [Line %d] "), __func__, __LINE__); 
NSLog(@"userName = %@", userName); 

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
[standardUserDefaults setBool:YES forKey:@"hasValidLogin"]; 
[standardUserDefaults synchronize]; 


[self.tabBarController setSelected:/* How do i find the last touched tabbar*/]; 
} 

任何良好做法,配方和代码片断,你能不能告诉我是赞赏。

我正在阅读亚光的iOS食谱。但我找不到与此相关的任何内容。

回答

0

关注UITabBarDelegate didSelectItem。跟踪之前选择的选项卡项目。如果用户未通过身份验证,请弹出您的身份验证屏幕并选择之前选择的选项卡项目。这是一个例子。

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { 


switch (item.tag) { 

    case ME_TAB_BAR_TAG: 

     if ([AppHelper checkAuthentication]) { 

      [self showMe:YES]; 

     } else if (previousItem) { 

      [tabBar setSelectedItem:previousItem]; 

      return; 

     } 

     break; 

    case ITEMS_TAB_BAR_TAG: 

     [self showMe:NO]; 

     break; 

    case CREATE_TAB_BAR_TAG: 

     if ([AppHelper checkAuthentication]) { 

      [self createNewItem]; 

     } else if (previousItem) { 

      [tabBar setSelectedItem:previousItem]; 

      return; 

     } 

     break; 

} 

previousItem = item; 


} 
+0

谢谢彼得!这是否是这样做的首选方式?有没有其他方法可以让我们做到这一点? – mohan 2012-03-02 05:48:01

+1

谢谢彼得!这是否是这样做的首选方式?有没有其他方法可以让我们做到这一点?而当我试图按照你描述的方式,我得到 - “'NSInternalInconsistencyException',原因:'不允许更改由标签栏控制器管理的标签栏的代理。 ***第一次投掷时调用堆栈:“ – mohan 2012-03-02 05:57:08

+0

我遇到了同样的问题。任何人都可以帮忙 – VvDPzZ 2012-11-02 07:51:00