前言
目前APP登錄有兩種方式:
- 啟動(dòng)程序后必須先登錄新荤,成功后才能進(jìn)入主界面
- 先進(jìn)入主界面,當(dāng)用戶動(dòng)作觸發(fā)個(gè)人信息的時(shí)候才去登錄
寫(xiě)這篇文章著重于分析第二種情況的實(shí)現(xiàn)思路鸿染,以及實(shí)現(xiàn)的幾種方式
實(shí)現(xiàn)思路
實(shí)現(xiàn)后登衡便,就需要把登錄的信息存儲(chǔ)到本地,當(dāng)需要判斷是否登錄的時(shí)候骂租,本地本地的個(gè)人登錄數(shù)據(jù)來(lái)做判斷祷杈。需要登錄,模態(tài)出登錄的頁(yè)面渗饮,本人簡(jiǎn)單的做了個(gè)相關(guān)的demo
-
最傳統(tǒng)的實(shí)現(xiàn)方式但汞,附上相關(guān)代碼:
NSString * username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"]; NSString * password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"]; if (!stringIsEmpty(username)&&!stringIsEmpty(password)) { //已登錄 [self performSegueWithIdentifier:@"myRecordSegue" sender:nil]; }else{ //跳轉(zhuǎn)到登陸頁(yè)面 UIViewController * loginViewController = [CommonTool sbWithName:@"Main" identifier:@"LoginViewController"]; UINavigationController * navgationVC = [[UINavigationController alloc] initWithRootViewController:loginViewController]; [self presentViewController:navgationVC animated:YES completion:^{ }]; }
demo上簡(jiǎn)單的做了個(gè)本地存儲(chǔ),真正項(xiàng)目里面最好需要轉(zhuǎn)成單例去做是否登錄判斷互站。好了私蕾,后登實(shí)現(xiàn)了。
but胡桃,but踩叭,感覺(jué)好麻煩的樣子!一坨代碼好長(zhǎng),如果應(yīng)用中有N個(gè)地方都需要容贝,那豈不是好多冗余的代碼W愿!嗤疯!好吧冤今,做個(gè)改進(jìn)版。茂缚。戏罢。 采用繼承的思想,把相關(guān)代碼封裝到基類【baseViewController&&baseTableViewController】
好吧脚囊,算是升華了一級(jí)吧龟糕,具體使用的時(shí)候,只需要關(guān)注登錄后的代碼 即可
if ([self isCheckingLogined]) {
[self performSegueWithIdentifier:@"myRecordSegue" sender:nil];
}
當(dāng)然悔耘,這種實(shí)現(xiàn)讲岁,通用可以用類別實(shí)現(xiàn),用類別的話衬以,只需要寫(xiě)UIViewController的類別即可
好像已經(jīng)解決了繁瑣的代碼缓艳,似乎完美了,不過(guò)看峻,為毛我點(diǎn)了收藏按鈕阶淘,登錄之后,好像我還得再點(diǎn)一次才能收藏成功互妓,好麻煩的趕腳溪窒。還有,我有些 地方取消登錄了冯勉,要告知具體的地方澈蚌,或許要做一些其他的操作。
實(shí)現(xiàn)方式有兩種灼狰,代理和block宛瞄。
-
用block把登陸或者取消登錄操作告知具體的頁(yè)面
@interface LoginViewController : BaseViewController @property (nonatomic, copy) ZCBasicBlock loginOkBlock; @property (nonatomic, copy) ZCBasicBlock loginCancelBlock; @end
loginCancelBlock調(diào)用時(shí)機(jī),是在取消登錄[關(guān)閉登錄頁(yè)面]的時(shí)候調(diào)用
loginOkBlock調(diào)用時(shí)機(jī)交胚,是在登錄成功的時(shí)候調(diào)用坛悉,具體代碼就不贅述,詳細(xì)參考demo
依舊采用繼承的方式
具體使用的地方承绸,也很簡(jiǎn)單
[self checkLoginWithLoginedBlock:^{
NSLog(@"login sucess");
[self performSegueWithIdentifier:@"myRecordSegue" sender:nil];
} loginCancelBlock:^{
NSLog(@"cancel login");
}];
同樣,這種實(shí)現(xiàn)方式也可以寫(xiě)成類別[個(gè)人推薦類別挣轨,畢竟只要寫(xiě)UIViewController的類別即可]
拓展
以上幾種方式军熏,基本已經(jīng)能滿足后登錄的需求實(shí)現(xiàn),不過(guò)還有一種實(shí)現(xiàn)思路:
可以把需要登錄才能展現(xiàn)的頁(yè)面對(duì)應(yīng)的類整理起來(lái)卷扮,放到數(shù)組里面荡澎,重寫(xiě)導(dǎo)航的push方法均践,在這一層做個(gè)過(guò)濾,我把它稱作頁(yè)面攔截
摩幔,具體需要登錄展現(xiàn)的頁(yè)面彤委,我都不用去關(guān)心到底是否登錄。
FeaturedViewController * featuredVC = [[FeaturedViewController alloc] init];
//self.navigationController 是你要重寫(xiě)的導(dǎo)航類
[self.navigationController pushViewController:featuredVC animated:YES];
checkContollerIsNeedLogin實(shí)現(xiàn)方法如下
- (BOOL )checkContollerIsNeedLogin:(UIViewController*)controller
{
for (NSString * classString in self.needLoginsArray) {
Class tempClass = NSClassFromString(classString);
if ([controller isKindOfClass:tempClass]) {
return YES;
}
}
return NO;
}
對(duì)于點(diǎn)擊按鈕進(jìn)行頁(yè)面跳轉(zhuǎn)的可以使用此方式或衡,像本頁(yè)面操作[點(diǎn)擊關(guān)注焦影,收藏等動(dòng)作]可能就無(wú)法使用該功能。這個(gè)嘛就見(jiàn)仁見(jiàn)智了
代碼鏈接:https://github.com/albertjson/LoginDemo
對(duì)于文章中有意見(jiàn)的封断,歡迎交流斯辰!