需求
项目中需要,在点击“我的”时,检测用户是都登陆,如果没有登陆,就跳转到登陆、注册页面,否则直接进入我的主页面。
项目采用的是登陆时,返回一个token,所以每次登陆时,我都存储token,然后去判断token是否过期,如果过期就进行重新的登陆,否则直接进入我的主控制器。
在点击“我的”这个tabbarItem时,会调用 -(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 这个方法,在这个方法中我们进行与token相关的判断,因为每个项目判断是否登陆的方式不同,在这里仅仅作为参考。
UITabBarController代码
@interface GCTabBarController ()<UITabBarControllerDelegate>
@end
@implementation GCTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
self.delegate = self;
//设置背景色及shadow
self.tabBar.backgroundColor = [UIColor decColorWithRed:250 green:250 blue:250 alpha:1];
self.tabBar.layer.shadowOffset = CGSizeMake(0, -0.5);
self.tabBar.layer.shadowColor = [UIColor decColorWithRed:223 green:224 blue:223 alpha:1].CGColor;
//设置高亮颜色
[self.tabBar setTintColor:[UIColor decColorWithRed:255 green:122 blue:122 alpha:1]];
// 添加四个控制器,并用原生的navigation包装
GCHomeViewController *homeVC = [[GCHomeViewController alloc]init];
homeVC.tabBarItem.image = [UIImage imageNamed:@"icHome"];
homeVC.tabBarItem.selectedImage = [UIImage imageNamed:@"icHomeActive"];
homeVC.tabBarItem.title = @"发现";
GCNavigationController *homeNaviCV = [[GCNavigationController alloc]initWithRootViewController:homeVC];
[self addChildViewController:homeNaviCV];
GCSnacksViewController *snacksVC = [[GCSnacksViewController alloc]init];
GCNavigationController *snacksNaviCV = [[GCNavigationController alloc]initWithRootViewController:snacksVC];
snacksVC.tabBarItem.title = @"零食库";
snacksVC.tabBarItem.image = [UIImage imageNamed:@"icExplore"];
snacksVC.tabBarItem.selectedImage = [UIImage imageNamed:@"icExploreActive"];
[self addChildViewController:snacksNaviCV];
GCShoppingCartViewController *shoppingCartVC = [[GCShoppingCartViewController alloc]init];
GCNavigationController *shoppingCartNaviCV = [[GCNavigationController alloc]initWithRootViewController:shoppingCartVC];
shoppingCartVC.tabBarItem.image = [UIImage imageNamed:@"icShoppingCart"];
shoppingCartVC.tabBarItem.selectedImage = [UIImage imageNamed:@"icShoppingCartActive"];
shoppingCartVC.tabBarItem.title =@"购物车";
[self addChildViewController:shoppingCartNaviCV];
// GCMineViewController *mineVC = [[GCMineViewController alloc]init];
GCLoginedMineViewController *mineVC = [[GCLoginedMineViewController alloc]init];
GCNavigationController *mineNaviCV = [[GCNavigationController alloc]initWithRootViewController:mineVC];
mineVC.tabBarItem.title = @"我的";
mineVC.tabBarItem.image = [UIImage imageNamed:@"icMe"];
mineVC.tabBarItem.selectedImage = [UIImage imageNamed:@"icMeActive"];
[self addChildViewController:mineNaviCV];
}
#pragma mark -判断是否需要登陆
-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
if([viewController.tabBarItem.title isEqualToString:@"我的"]){
// 如果能获取数据,就说明token没过期,否则重新登陆
GCToken *token = [GCTokenManager getToken];
//!!!!!!!!!这个的token.access_token != nil只是举例,具体项目具体分析
if (token.access_token != nil) {
return YES;
}else{
GCMineViewController *mineViewC =[[GCMineViewController alloc]init] ;
GCNavigationController *loginNav = [[GCNavigationController alloc] initWithRootViewController:mineViewC]; //使登陆界面的Navigationbar可以显示出来
[((UINavigationController *)tabBarController.selectedViewController) presentViewController:loginNav animated:YES completion:nil]; //跳转登陆界面
// 登陆成功后,接到通知,跳转到登陆成功的tabbarItem
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loginSuccess:) name:@"loginSuccess" object:nil];
return NO;
}
}else{
return YES;
}
}
-(void)loginSuccess:(NSNotification *)notification
{
self.selectedViewController = self.childViewControllers[3];
}
注意
这里需要注意的是,需要遵守UITabBarControllerDelegate协议,才能在每次点击时调用 -(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 这个方法。 在这个方法中的判断条件
//!!!!!!!!!这个的token.access_token != nil只是举例,具体项目具体分析
if (token.access_token != nil) {
return YES;
}
需要根据自己项目的实际情况进行改变。
现在假如还未登陆:
进行密码输入点击登陆,进行验证:
需要告知tabbar控制器,跳转到哪一个控制器,并且销毁掉当前的登陆控制器,下方的tabbar才会正常显示,而不能直接在登陆成功的方法中跳转到“我的”控制器, 这样下面的tabbra不会显示,退出程序,再次登陆时,正常显示
综上分析:
登陆页面点击登陆按钮的方法
#pragma mark -登录
- (void) clickedLoginBtn
{
// 1 请求管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 获取失败后,进入序列化的格式
manager.responseSerializer = [AFJSONResponseSerializer serializer];
// 2 设置参数
。
。
。
。
// 3 登陆,获取token
[manager POST:@"http://139.196.22.0:8080/api/v1/oauth/token" parameters:logInParas success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"登录成功");
// 数据持久化,将返回的令牌存到沙盒
GCToken *token = [GCToken mj_objectWithKeyValues:responseObject];
[GCTokenManager saveToken:token];
// 登录成功默认登录成功,跳入用户页面
[[NSNotificationCenter defaultCenter]postNotificationName:@"loginSuccess" object:nil userInfo:nil];
[self dismissViewControllerAnimated:YES completion:nil];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"登录失败,%@",error);
}];
}
这里登陆成功的block中,利用消息机制传出登陆成功的消息,在tabbarController中接收到消息,模拟点击taabarItem,并且销毁当前的登陆页面。整个过程完成。