在APP中,都存在登录和退出操作。登录和退出再实现起来并不难。但是有些又是我们需要理清楚的。
一、几个问题
1.从哪里跳转到登录页面来?
2.登录后跳转到哪里去?
3.退出登录后再跳转到哪里去?
4.怎么知道用户是否已经登录了?
在解决这些问题前,先看看我的一个demo的项目结构。
二、demo结构
主要分四个板块:设置用户是否登录(简化操作,采用模拟的操作)、收藏、关注和我(展示用户是否登录)。
在首页(最上面的那个VC)有两个按钮,一个用来设置用户为登录状态,一个是用来设置用户为未登录状态。设置为未登录就需要跳转到登录页面。
在第二个VC和第三个VC是收藏和关注页面,页面就是一个按钮。
在第四个VC我里面就是现实用户是否登录了。
demo代码的结构:
三、解决问题
在一种的四个问题,其中问题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有点问题,给出百度云的链接。