iOS開發(fā)之登錄與訪客

自我革命——發(fā)現(xiàn)問題

在開發(fā)中,一直有這樣一種情境:App的未注冊用戶可以使用部分功能(訪客視圖),一旦需要使用一些核心功能或者獲取個(gè)性化、差異化的服務(wù)時(shí),就需要用戶登錄(登錄定制)。一般的情況是:

用戶點(diǎn)擊某個(gè)按鈕 ——> 彈出登錄界面 ——> 輸入信息  ——> 登錄驗(yàn)證  ——> 界面發(fā)生變化 

在幾年前做開發(fā)時(shí),由于項(xiàng)目需要快速上線,所以顧不上思考(其實(shí)是自己太菜),直接在需要判斷登錄的界面代碼里寫上如下代碼:

BOOL isLogin;

if(self.isLogin){
    //設(shè)置登錄后的界面

}
else{
    //顯示訪客視圖
    //如果用戶點(diǎn)擊登錄則跳轉(zhuǎn)登錄界面
    //登錄完以后更新當(dāng)前界面為登錄后的界面
    
}

時(shí)間一長,代碼一多,就會發(fā)現(xiàn)很多界面有如上的重復(fù)代碼,這很顯然違背了Do not repeat yourself的原則,而且跳轉(zhuǎn)的邏輯很煩。于是開始改進(jìn)代碼。

最先的一個(gè)哥們兒的做法是將登錄字段抽取到一個(gè)常量中,需要時(shí)判斷該值是否為真,然后執(zhí)行相應(yīng)的邏輯,這樣每個(gè)類中就省去了一個(gè)字段。

if(CONSTANT.isLogin){
    //設(shè)置登錄后的界面

}
else{
    //顯示訪客視圖
    //如果用戶點(diǎn)擊登錄則跳轉(zhuǎn)登錄界面
    //登錄完以后更新當(dāng)前界面為登錄后的界面
    
}

隨著邏輯的增多,發(fā)現(xiàn)公用的代碼越來越多,于是抽取了父類,這樣邏輯就上移到了父類中,所有子類不需要有類似isLogin的屬性來判斷用戶是否登錄。

if(self.isLogin){
    //設(shè)置登錄后的界面

}
else{
    //顯示訪客視圖
    //如果用戶點(diǎn)擊登錄則跳轉(zhuǎn)登錄界面
    //登錄完以后更新當(dāng)前界面為登錄后的界面
    
}

突然有一天,我們發(fā)現(xiàn)某些App訪客視圖相似度非常大,某些App中的登錄界面也是一樣的,于是發(fā)現(xiàn)上面的代碼還是需要精簡,于是我們將上面的else部分也上移到父類中,也就是在父類中判斷用戶是否登錄,未登錄顯示訪客視圖,并且將用戶的是否登錄的字段isLogin抽離到一個(gè)專門的用戶模型中。

摸著石頭過河——解決問題

主界面架構(gòu)是這樣的:


UITabBarController中嵌套UINavigationController.png

一開始,進(jìn)入的時(shí)候,都顯示訪客界面,顏色為青色,點(diǎn)擊中間的+彈出登錄界面,點(diǎn)擊登錄界面的+表示登錄過程,然后主界面顯示登錄后的各個(gè)界面,以不同顏色代替,如下圖所示。

登錄與訪客.gif

主界面的搭建代碼這里就不貼了,很簡單,主要講解一下登錄與訪客的邏輯實(shí)現(xiàn)。

  1. 父類視圖控制器
@interface BaseViewController : UIViewController

@property (nonatomic, assign) BOOL isLogin;

@end


@implementation BaseViewController

-(void)loadView{
    
    //UserModel是一個(gè)單例用戶類
    self.isLogin = [UserModel shareInstance].isLogin;
    
    //根據(jù)isLogin判斷用戶是否登錄 如果未登錄就顯示訪客視圖 否則就顯示正常界面
    //但是注意 子視圖同樣需要在viewDidLoad中判斷用戶是否登錄
    //在登錄界面 應(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
  1. 子類視圖控制器(四個(gè)子類都差不多,這里貼一個(gè))
@implementation FourViewController

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

@end
  1. 中間視圖控制器
@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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容