iOS開(kāi)發(fā)教程之登錄與訪(fǎng)客的邏輯實(shí)現(xiàn)
自我革命——發(fā)現(xiàn)問(wèn)題
在開(kāi)發(fā)中,一直有這樣一種情境:App的未注冊(cè)用戶(hù)可以使用部分功能(訪(fǎng)客視圖),一旦需要使用一些核心功能或者獲取個(gè)性化、差異化的服務(wù)時(shí),就需要用戶(hù)登錄(登錄定制)。一般的情況是:
用戶(hù)點(diǎn)擊某個(gè)按鈕 ——> 彈出登錄界面 ——> 輸入信息 ——> 登錄驗(yàn)證 ——> 界面發(fā)生變化
在幾年前做開(kāi)發(fā)時(shí),由于項(xiàng)目需要快速上線(xiàn),所以顧不上思考(其實(shí)是自己太菜),直接在需要判斷登錄的界面代碼里寫(xiě)上如下代碼:
BOOL isLogin; if(self.isLogin){ //設(shè)置登錄后的界面 } else{ //顯示訪(fǎng)客視圖 //如果用戶(hù)點(diǎn)擊登錄則跳轉(zhuǎn)登錄界面 //登錄完以后更新當(dāng)前界面為登錄后的界面 }
時(shí)間一長(zhǎng),代碼一多,就會(huì)發(fā)現(xiàn)很多界面有如上的重復(fù)代碼,這很顯然違背了Do not repeat yourself的原則,而且跳轉(zhuǎn)的邏輯很煩。于是開(kāi)始改進(jìn)代碼。
最先的一個(gè)哥們兒的做法是將登錄字段抽取到一個(gè)常量中,需要時(shí)判斷該值是否為真,然后執(zhí)行相應(yīng)的邏輯,這樣每個(gè)類(lèi)中就省去了一個(gè)字段。
if(CONSTANT.isLogin){ //設(shè)置登錄后的界面 } else{ //顯示訪(fǎng)客視圖 //如果用戶(hù)點(diǎn)擊登錄則跳轉(zhuǎn)登錄界面 //登錄完以后更新當(dāng)前界面為登錄后的界面 }
隨著邏輯的增多,發(fā)現(xiàn)公用的代碼越來(lái)越多,于是抽取了父類(lèi),這樣邏輯就上移到了父類(lèi)中,所有子類(lèi)不需要有類(lèi)似isLogin的屬性來(lái)判斷用戶(hù)是否登錄。
if(self.isLogin){ //設(shè)置登錄后的界面 } else{ //顯示訪(fǎng)客視圖 //如果用戶(hù)點(diǎn)擊登錄則跳轉(zhuǎn)登錄界面 //登錄完以后更新當(dāng)前界面為登錄后的界面 }
突然有一天,我們發(fā)現(xiàn)某些App訪(fǎng)客視圖相似度非常大,某些App中的登錄界面也是一樣的,于是發(fā)現(xiàn)上面的代碼還是需要精簡(jiǎn),于是我們將上面的else部分也上移到父類(lèi)中,也就是在父類(lèi)中判斷用戶(hù)是否登錄,未登錄顯示訪(fǎng)客視圖,并且將用戶(hù)的是否登錄的字段isLogin抽離到一個(gè)專(zhuān)門(mén)的用戶(hù)模型中。
摸著石頭過(guò)河——解決問(wèn)題
主界面架構(gòu)是這樣的:
UITabBarController中嵌套UINavigationController.png
一開(kāi)始,進(jìn)入的時(shí)候,都顯示訪(fǎng)客界面,顏色為青色,點(diǎn)擊中間的+彈出登錄界面,點(diǎn)擊登錄界面的+表示登錄過(guò)程,然后主界面顯示登錄后的各個(gè)界面,以不同顏色代替,如下圖所示。
登錄與訪(fǎng)客.gif
實(shí)現(xiàn)方法
主界面的搭建代碼這里就不貼了,很簡(jiǎn)單,主要講解一下登錄與訪(fǎng)客的邏輯實(shí)現(xiàn)。
1、父類(lèi)視圖控制器
@interface BaseViewController : UIViewController @property (nonatomic, assign) BOOL isLogin; @end @implementation BaseViewController -(void)loadView{ //UserModel是一個(gè)單例用戶(hù)類(lèi) self.isLogin = [UserModel shareInstance].isLogin; //根據(jù)isLogin判斷用戶(hù)是否登錄 如果未登錄就顯示訪(fǎng)客視圖 否則就顯示正常界面 //但是注意 子視圖同樣需要在viewDidLoad中判斷用戶(hù)是否登錄 //在登錄界面 應(yīng)該重新賦值window的rootViewController 刷新控制器的狀態(tài) 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、子類(lèi)視圖控制器(四個(gè)子類(lèi)都差不多,這里貼一個(gè))
@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
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
iOS 水波紋動(dòng)畫(huà)的實(shí)現(xiàn)效果
本篇文章主要介紹了iOS 水波紋的實(shí)現(xiàn)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01iOS實(shí)現(xiàn)視頻壓縮上傳實(shí)例代碼
本篇文章主要介紹了iOS實(shí)現(xiàn)視頻壓縮上傳實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04解決ios h5 input輸入框被輸入法彈出一塊區(qū)域的問(wèn)題
今天小編就為大家分享一篇解決ios h5 input輸入框被輸入法彈出一塊區(qū)域的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08iOS開(kāi)發(fā)中#import、#include和@class的區(qū)別解析
這篇文章主要介紹了iOS開(kāi)發(fā)中#import、#include和@class的區(qū)別解析,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-08-08iOS開(kāi)發(fā)之TextField禁用粘貼、選擇和全選功能
這篇文章主要為大家詳細(xì)介紹了iOS開(kāi)發(fā)之TextField禁用粘貼、選擇和全選功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09iOS9開(kāi)放的新API--Spotlight使用指南
作為蘋(píng)果iOS9的重要特性之一,Spotlight搜索如今重新回到主界面最左側(cè)(同樣支持主界面下滑呼出),通過(guò)API的支持,還帶來(lái)了全新的Universal Search通用搜索功能,除了網(wǎng)絡(luò)以及系統(tǒng)本身內(nèi)容之外,還能直接搜索第三方應(yīng)用內(nèi)的相關(guān)內(nèi)容。下面我們就來(lái)詳細(xì)研究下Spotlight2015-11-11AVFoundation AVCaptureSession媒體捕捉
這篇文章主要為大家介紹了ios開(kāi)發(fā)AVFoundation AVCaptureSession媒體捕捉詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10iOS開(kāi)發(fā)之?dāng)?shù)字每隔3位用逗號(hào)分隔
以前在做電商app時(shí)經(jīng)常會(huì)針對(duì)稍大的金額展示出來(lái),需要每隔千位添加逗號(hào)便于用戶(hù)識(shí)別,下面通過(guò)本文給大家分享ios中數(shù)字每隔3位用逗號(hào)分隔的實(shí)例代碼,需要的朋友參考下吧2017-09-09舉例講解Objective-C中@property屬性的用法
這篇文章主要介紹了Objective-C中@property屬性的用法,包括@property的屬性關(guān)鍵字的整理,需要的朋友可以參考下2016-03-03