iOS开发教程之登录与访客的逻辑实现

自我革命——发现问题

在开发中,一直有这样一种情境:App的未注册用户可以使用部分功能(访客视图),一旦需要使用一些核心功能或者获取个性化、差异化的服务时,就需要用户登录(登录定制)。一般的情况是:

用户点击某个按钮 ——> 弹出登录界面 ——> 输入信息  ——> 登录验证  ——> 界面发生变化

在几年前做开发时,由于项目需要快速上线,所以顾不上思考(其实是自己太菜),直接在需要判断登录的界面代码里写上如下代码:

BOOL isLogin;
if(self.isLogin){
 //设置登录后的界面

}
else{
 //显示访客视图
 //如果用户点击登录则跳转登录界面
 //登录完以后更新当前界面为登录后的界面

}

时间一长,代码一多,就会发现很多界面有如上的重复代码,这很显然违背了Do not repeat yourself的原则,而且跳转的逻辑很烦。于是开始改进代码。

最先的一个哥们儿的做法是将登录字段抽取到一个常量中,需要时判断该值是否为真,然后执行相应的逻辑,这样每个类中就省去了一个字段。

if(CONSTANT.isLogin){
 //设置登录后的界面

}
else{
 //显示访客视图
 //如果用户点击登录则跳转登录界面
 //登录完以后更新当前界面为登录后的界面

}

随着逻辑的增多,发现公用的代码越来越多,于是抽取了父类,这样逻辑就上移到了父类中,所有子类不需要有类似isLogin的属性来判断用户是否登录。

if(self.isLogin){
 //设置登录后的界面

}
else{
 //显示访客视图
 //如果用户点击登录则跳转登录界面
 //登录完以后更新当前界面为登录后的界面

}

突然有一天,我们发现某些App访客视图相似度非常大,某些App中的登录界面也是一样的,于是发现上面的代码还是需要精简,于是我们将上面的else部分也上移到父类中,也就是在父类中判断用户是否登录,未登录显示访客视图,并且将用户的是否登录的字段isLogin抽离到一个专门的用户模型中。

摸着石头过河——解决问题

主界面架构是这样的:


UITabBarController中嵌套UINavigationController.png

一开始,进入的时候,都显示访客界面,颜色为青色,点击中间的+弹出登录界面,点击登录界面的+表示登录过程,然后主界面显示登录后的各个界面,以不同颜色代替,如下图所示。

登录与访客.gif

实现方法

主界面的搭建代码这里就不贴了,很简单,主要讲解一下登录与访客的逻辑实现。

1、父类视图控制器

@interface BaseViewController : UIViewController
@property (nonatomic, assign) BOOL isLogin;
@end

@implementation BaseViewController
-(void)loadView{
 //UserModel是一个单例用户类
 self.isLogin = [UserModel shareInstance].isLogin;
 //根据isLogin判断用户是否登录 如果未登录就显示访客视图 否则就显示正常界面
 //但是注意 子视图同样需要在viewDidLoad中判断用户是否登录
 //在登录界面 应该重新赋值window的rootViewController 刷新控制器的状态
 self.isLogin ? [super loadView] : [self setupVisitorView];

}

-(void)setupVisitorView{
 UIView *view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
 view.backgroundColor = [UIColor cyanColor];
 self.view = view;
}
@end

2、子类视图控制器(四个子类都差不多,这里贴一个)

@implementation FourViewController

- (void)viewDidLoad {
 [super viewDidLoad];

 if (self.isLogin) {
  self.view.backgroundColor = [UIColor purpleColor];
 }
}

@end

3、中间视图控制器

@implementation CenterViewController

- (void)viewDidLoad {
 [super viewDidLoad];
 self.view.backgroundColor = [UIColor whiteColor];
 UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
 [btn setImage:[UIImage imageNamed:@"plusX_Last"] forState:UIControlStateNormal];
 btn.bounds = CGRectMake(0, 0, 64, 64);
 btn.center = self.view.center;
 [self.view addSubview:btn];
 if (!self.isLogin) {
  self.title = @"未登录";
  [btn addTarget:self action:@selector(login) forControlEvents:UIControlEventTouchUpInside];
 }
 else{
  self.title = @"已登陆";
  [btn addTarget:self action:@selector(close) forControlEvents:UIControlEventTouchUpInside];
 }
}

-(void)login{
 [UserModel shareInstance].isLogin = YES;
 // 一定要重新赋值一次rootViewController
 [self dismissViewControllerAnimated:YES completion:^{
  [UIApplication sharedApplication].keyWindow.rootViewController = [[YFTabbarController alloc]init];
 }];
}

-(void)close{
 [self dismissViewControllerAnimated:YES completion:nil];

}

@end

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • iOS中关于Cookie验证登录状态

    1.第一次进入应用,登录获取Cookie,此时如果用到的是AFN去获取接口数据,Cookie已经写入了,所以无需处理,每次请求的时候,会自动将该cookie传给后台去验证 2.将Cookie缓存到本地: NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]]; NSUserDefaults *default

  • IOS实现微信授权登录功能

    微信是一个在开发中经常会使用到的平台,比如微信登录.授权.支付.分享.今天我们来看看如何在自己的应用里面集成微信授权. 1.微信授权的定义 微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等. 2.微信授权的步骤 第三方发

  • iOS微信第三方登录实例

    本文实例为大家分享了iOS微信第三方登录,供大家参考,具体内容如下 一.准备工作 1.到微信开放平台注册成开发者,获取appid 2.导入WeChatConnection.framework 3.配置URL Schemes  输入appid  例如wx29ce0f21ea982cb8 二.配置AppDelegate.m 1. 注册微信 //微信登陆 [WXApi registerApp:WeiXin_AppId withDescription:@"weixin"]; 2.设置函数 //

  • iOS指纹登录(TouchID)集成方案详解

    TouchID指纹识别是iPhone 5S设备中增加的一项重大功能.苹果的后续移动设备也相继添加了指纹功能,在实际使用中还是相当方便的,比如快捷登录,快捷支付等等.系统提供了相应框架,使用起来还是比较方便的.使用LAContext对象即可完成指纹识别,提高用户体验. 提示:指纹识别必须用真机测试,并且在iOS8以上系统. TouchID API使用 1.添加头文件 #import 2.判断系统版本 //首先判断版本 if (NSFoundationVersionNumber < NSFounda

  • iOS实现第三方微信登录方式实例解析(最新最全)

    项目地址 : https://github.com/zhonggaorong/weixinLoginDemo 最新版本的微信登录实现步骤实现: 1.在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程. 地址: 点击打开链接 2. 下载最新的SDK 地址: 点击打开链接 SDK内容如下: 结构解析: 从上到下依次说明: 1. 静态库,直接拖入工程. 2. re

  • iOS微信第三方登录实现

    一.接入微信第三方登录准备工作. 移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统. 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程.(注意) 1.下载iOS微信SDK. 下载地址 2.将SDK放到工程目录中. 3.补充导入一些依赖框架. 4.添加URL Types 5.添加iOS9 URL Schemes. 注意:如

  • iOS QQ第三方登录实现

    本文实例为大家分享了iOS QQ第三方登录实现代码,供大家参考,具体内容如下 一.准备工作 1.到QQ开放平台(http://connect.qq.com/ )注册成为开发者,申请appkey, 2.在URL Types中添加QQ的AppID,其格式为:"tencent" + AppID    例如tencent1104463316 二.配置AppDelegate.m 1.导入<TencentOpenAPI/QQApiInterface.h> 和<TencentOpe

  • IOS开发用户登录注册模块所遇到的问题

    最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是个不小的奇迹了.本文就总结一下如何满足产品需要的情况下,高效开发一个登录注册模块. 1.利用继承解决界面重复性功能.通常登录注册会有一个独立的设计,而模块内部会有有相似的背景,相似的导航栏样式,相似返回和退出行为,相似的输入框,按钮样式等. 比如上面的的注册和登录模块,就有相同的返回按钮,相同的背景

  • vue+axios实现登录拦截的实例代码

    一个项目学会vue全家桶+axios实现登录.拦截.登出功能,以及利用axios的http拦截器拦截请求和响应. 前言 该项目是利用了Github 提供的personal token作为登录token,通过token访问你的Repository List.通过这个项目学习如何实现一个前端项目中所需要的 登录及拦截.登出.token失效的拦截及对应 axios 拦截器的使用. 准备你需要先生成自己的 Github Personal Token( 生成Token). Token 生成后 访问Demo

  • iOS开发教程之登录与访客的逻辑实现

    自我革命--发现问题 在开发中,一直有这样一种情境:App的未注册用户可以使用部分功能(访客视图),一旦需要使用一些核心功能或者获取个性化.差异化的服务时,就需要用户登录(登录定制).一般的情况是: 用户点击某个按钮 --> 弹出登录界面 --> 输入信息  --> 登录验证  --> 界面发生变化 在几年前做开发时,由于项目需要快速上线,所以顾不上思考(其实是自己太菜),直接在需要判断登录的界面代码里写上如下代码: BOOL isLogin; if(self.isLogin){

  • IOS开发中异步网络请求上实现同步逻辑

    IOS开发中异步网络请求上实现同步逻辑 前提: 可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不需要上传了,直接报错. 之前ASI的网络库中是有同步请求的接口,所以很好处理,AFNetwork的网络库只有异步的网络请求,该怎么实现呢? 1.循环异步拼组 - (void)uploadFile:(NSArray *)imageArray atIndex:(NSInteger)index imagesCount:(NSInteger

  • iOS开发教程之单例使用问题详析

    导语 单例(Singletons),是Cocoa的核心模式之一.在iOS上,单例十分常见,比如:UIApplication,NSFileManager等等.虽然它们用起来十分方便,但实际上它们有许多问题需要注意.所以在你下次自动补全dispatch_once代码片段的时候,想一下这样会导致什么后果. 什么是单例 在<设计模式>一书中给出了单例的定义: 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式提供了一个访问点,供客户类为共享资源生成唯一实例,并通过它来对共享资源

  • iOS开发教程之常见的性能优化技巧

    前言 性能问题的主要原因是什么,原因有相同的,也有不同的,但归根到底,不外乎内存使用.代码效率.合适的策略逻辑.代码质量.安装包体积这一类问题. 但从用户体验的角度去思考,当我们置身处地得把自己当做用户去玩一款应用时候,那么都会在意什么呢?假如正在玩一款手游,首先一定不希望玩着玩着突然闪退,然后就是不希望卡顿,其次就是耗电和耗流量不希望太严重,最后就是安装包希望能小一点.简单归类如下: 快:使用时避免出现卡顿,响应速度快,减少用户等待的时间,满足用户期望. 稳:不要在用户使用过程中崩溃和无响应.

  • iOS开发教程之自定制图片浏览器

    前言 图片浏览器大家应该都用过,这方面的第三方也有很多,不过有时候第三方会跟我们的需求有一些出入,这就需要我们要么对第三方进行修改要么自己重新定制.我是比较喜欢自己重新定制的,在这给大家简单介绍一下我定制的图片浏览器,算是给大家提供一个思路,可以在此基础上进行修改完善. 实现原理 通过弹出UIViewController的形式来展示图片,使用UICollectionView并添加手势来实现图片浏览时图片的间隔. 首先创建一个继承于UIViewController的控制器,来作为图片浏览器的控制器

  • iOS开发教程之识别图片中二维码功能的实现

    前言 大家应该都知道在iOS的CoreImage的Api中,有一个CIDetector的类,Detector的中文翻译有探测器的意思,那么CIDetector是用来做哪些的呢? 它可以: CIDetectorTypeFace 面部识别 CIDetectorTypeText 文本识别 CIDetectorTypeQRCode 条码识别 CIDetectorTypeRectangle 矩形识别 这个类其实很简单,它的头文件代码很少,下面来看一下注释 open class CIDetector : N

  • iOS开发教程之扇形动画的实现

    前言 最近比较闲,正好利用这段时间把现在项目用的东西封装一下,方便以后复用,当然好的东西还是要分享.一起学习,一起进步. 看图片,很显然这是一个扇形图,相信大家对做扇形图得心应手,可能对做扇形动画有一定难度,不急,下面给出代码和思路. 针对项目用的扇形动画,在这个基础上我做了一下封装. 核心代码如下: -(instancetype)initWithCenter:(CGPoint)center radius:(CGFloat)radius bgColor:(UIColor *)bgColor re

  • 支付宝支付开发IOS图文教程案例

    前言:继上次<微信支付开发IOS图文教程案例>以来,一直没有太多时间,更新总结详细支付这样的长篇大论,很抱歉.今天,推出支付宝支付的详细流程. 1.开始下载和查看支付宝支付的Demo. 我们直接进入支付宝的支付平台参考来进行集成支付宝支付: https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.jIUkAQ&treeId=59&articleId=103675&docType=1 集成过程基本

  • iOS开发傻瓜式微信支付的方法教程

    前言 本文主要给大家介绍了关于iOS开发傻瓜式微信支付的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍吧. 方法步骤如下: 先下载微信SDK,如果集成了友盟分享里的微信,那就不用下载,也不用配置环境,因为配置友盟分享的时候已经把微信支付的环境都配置好了(包括框架,schema跳转,白名单)如果没有集成过友盟分享那么请到微信开放平台下载SDK 如果公司没有给微信平台的appkey则需要自己帮公司去微信平台申请 工程的bundle id 也要和在微信平台注册的bundle id一样 链接

  • iOS开发教程之UIView和UIViewController的生命周期详解

    前言 iOS开发中,创建View常见的两种方式一个是纯代码,一个是借助于XIB:创建ViewController常见的也有两种方式一个是纯代码,一个是借助于StoryBoard. 通过交流我发现很多童鞋对这些概念都很模糊,于是通过实验写一篇博客供参考. 重写View的如下方法 @implementation YFView -(instancetype)init{ self = [super init]; NSLog(@"%s", __func__); return self; } -(

随机推荐