在APP中,都存在登录和退出操作。登录和退出再实现起来并不难。但是有些又是我们需要理清楚的。

一、几个问题

1.从哪里跳转到登录页面来?

2.登录后跳转到哪里去?

3.退出登录后再跳转到哪里去?

4.怎么知道用户是否已经登录了?

在解决这些问题前,先看看我的一个demo的项目结构。

二、demo结构

ios 优雅的退出登录 ipone退出登录_页面跳转

主要分四个板块:设置用户是否登录(简化操作,采用模拟的操作)、收藏、关注和我(展示用户是否登录)。

在首页(最上面的那个VC)有两个按钮,一个用来设置用户为登录状态,一个是用来设置用户为未登录状态。设置为未登录就需要跳转到登录页面。

在第二个VC和第三个VC是收藏和关注页面,页面就是一个按钮。

在第四个VC我里面就是现实用户是否登录了。

demo代码的结构:

ios 优雅的退出登录 ipone退出登录_ios 优雅的退出登录_02

三、解决问题

在一种的四个问题,其中问题1 2 3可以归为一类:页面跳转的问题。问题4又是一类,怎么存储登录信息?存储登录信息一般使用数据库,因为要存储的不仅仅只是用户名和密码信息。这里我为了方便,仅仅使用的是NSUserDefaults来存储登录和退出这两种状态。

关于页面跳转的问题,这里不再细说。我只说这篇里面需要实现的。

在登录页面的VC里面我写了这么两个方法:

- (void)popBack{
    if (self.loginType == LoginType_Normal) {
        [self.navigationController popViewControllerAnimated:YES];
    }
    else if (self.loginType == LoginType_Parent){
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    else{
        [self.navigationController popToRootViewControllerAnimated:YES];
//        [self.tabBarController setSelectedIndex:3];
    }
}

+ (void)login:(UIViewController *)ctrl loginType:(LoginType)loginType{
    if ([LoginState isLogin]) { // 已经登录了
        return;
    }
    else{ // 没有登录
        LoginViewController *LVC = [[LoginViewController alloc] init];
        LVC.loginType = loginType;
        if (loginType == LoginType_Normal) {
            [ctrl.navigationController pushViewController:LVC animated:YES];
        }
        else if (loginType == LoginType_Parent){
            [ctrl presentViewController:LVC animated:YES completion:nil];
        }
        else{
            [ctrl.navigationController pushViewController:LVC animated:YES];
        }
    }
}

在.h文件里面:有一个枚举

typedef NS_ENUM(NSInteger, LoginType) {
    LoginType_Normal = 0,
    LoginType_Parent,
    LoginType_Root,
};

第一个是返回,第二个是登录跳转。

在LoginStat这个类里面写了三个方法:检查用户有没有登录,设置用户为登录状态和设置用户为未登录状态。

+ (BOOL)isLogin{
    NSString *login = [[NSUserDefaults standardUserDefaults] objectForKey:@"LOGIN"];
    return login.intValue;
}

+ (void)setLogined{
    [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"LOGIN"];
}

+ (void)setLoginOuted{
    [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"LOGIN"];
}



现在两个问题基本解决了。那么我们怎么使用呢?以首页这个VC里面的使用方法为例。

// 设置为登录状态
- (IBAction)login:(UIButton *)sender {
    [LoginState setLogined];
}
// 设置为未登录状态
- (IBAction)noLogin:(UIButton *)sender {
    [LoginState setLoginOuted];
    [LoginViewController login:self loginType:LoginType_Root];
}

由于使用的是storyboard&xib加代码方式做的,做每个VC里面的代码不多。


在其他VC里面就不需要设置用户是否登录了,只需要做跳转就可以了。

例如下面收藏页面的做法。

- (IBAction)collectionBtnClick:(UIButton *)sender {
    [LoginViewController login:self loginType:LoginType_Normal];
}

上面的两类四个问题解决了。这里只是提供一种解决方法。实际项目中的使用需要根据实际需求处理。

四、最后

在解决问题前,我们要分析问题,也就是问题已是什么?再要做的就是大胆的去实践。

最后贴上下载链接,由于我的github有点问题,给出百度云的链接。

下载请点我。