iOS点击“我的”,保持登陆状态

项目中需要,在点击“我的”时,检测用户是都登陆,如果没有登陆,就跳转到登陆、注册页面,否则直接进入我的主页面。
iOS点击“我的”,保持登陆状态_第1张图片

项目采用的是登陆时,返回一个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;
        }

需要根据自己项目的实际情况进行改变。

现在假如,我们没有登录
iOS点击“我的”,保持登陆状态_第2张图片

在输入密码,登陆成功后:
iOS点击“我的”,保持登陆状态_第3张图片

需要告知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,并且销毁当前的登陆页面。真个过程完成。
iOS点击“我的”,保持登陆状态_第4张图片
下方tabbar正常显示。

你可能感兴趣的:(iOS)