搭建App框架(MVVM+RAC+路由)

搭建App框架(MVVM+RAC+路由)

如果喜歡理逊,請給一個(gè)小星星。O(∩_∩)O謝謝准给!

GitHub地址

效果

路由.gif

項(xiàng)目的介紹

項(xiàng)目使用了ReactiveCocoa框架王污,實(shí)現(xiàn)了MVVM架構(gòu),使用MVVM架構(gòu)主要目的是分離視圖(View)和模型(Model)蔬顾。

MVVM四大優(yōu)點(diǎn):

  1. 低耦合宴偿。視圖(View)可以獨(dú)立于Model變化和修改,一個(gè)ViewModel可以綁定到不同的"View"上诀豁,當(dāng)View變化的時(shí)候Model可以不變酪我,當(dāng)Model變化的時(shí)候View也可以不變。
  2. 可重用性且叁。你可以把一些視圖邏輯放在一個(gè)ViewModel里面都哭,讓很多view重用這段視圖邏輯。
  3. 獨(dú)立開發(fā)逞带。開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel)欺矫,設(shè)計(jì)人員可以專注于頁面設(shè)計(jì),使用Expression
    Blend可以很容易設(shè)計(jì)界面并生成xaml代碼展氓。
  4. 可測試穆趴。界面素來是比較難于測試的,而現(xiàn)在測試可以針對ViewModel來寫

項(xiàng)目的搭建

1.搭建項(xiàng)目主框架

68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f323031383131313331313231343932322e706e673f782d6f73732d70726f636573733d696d6167652f77617465726d61726b2c747970655f5a6d46755a33706f5a57356e6147567064476b2c736861646f775f31302c746578745f61.png

2.CocoaPods集成的第三方框架

  • AFNetworking 網(wǎng)絡(luò)請求
  • DateTools 日期的相對處理
  • JLRoutes 路由跳轉(zhuǎn)
  • JPFPSStatus 顯示屏幕的幀數(shù)
  • MBProgressHUD 蒙版
  • MJExtension 字典轉(zhuǎn)模型框架
  • MJRefresh 界面刷新
  • MYLayout 浮動(dòng)布局
  • ReactiveCocoa 函數(shù)響應(yīng)式編程
  • SDAutoLayout 簡單的布局
  • SDCycleScrollVIew 無限循環(huán)輪播圖
  • SDWebImage 加載圖片

3.初步搭建界面

1.初始化項(xiàng)目
- (void)registerRoutes{

    HQTabBarController *rootVC = [HQTabBarController  tabBarControllerWithAddChildVCsBlock:^(WZXTabBarController *tabBarC) {
        
        [tabBarC addChildVC:[HQHomeViewController new] title:@"主頁" normalImageName:@"tabar_zhuye2.png" selectedImageName:@"tabar_zhuye.png" isRequiredNavController:YES];
        [tabBarC addChildVC:[HQCircleFriendsViewController new] title:@"主頁2" normalImageName:@"tabar_tuijian2.png" selectedImageName:@"tabar_tuijiani.png" isRequiredNavController:YES];
        [tabBarC addChildVC:[HQHomeViewController new] title:@"中間按鈕" normalImageName:@"tabar_suishoupai2.png" selectedImageName:@"tabar_suishoupai.png" isRequiredNavController:YES];
        [tabBarC addChildVC:[HQFindViewController new] title:@"朋友" normalImageName:@"tabar_linxin2.png" selectedImageName:@"tabar_linxin.png" isRequiredNavController:YES];
        [tabBarC addChildVC:[HQAccountViewController new] title:@"我的" normalImageName:@"tabar_geren2.png" selectedImageName:@"tabar_geren.png" isRequiredNavController:YES];
        
    }];
    
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    self.window.rootViewController = rootVC;
    [self.window makeKeyAndVisible];
//    navigation Push規(guī)則
    [[JLRoutes globalRoutes] addRoute:@"/NaviPush/:controller" handler:^BOOL(NSDictionary<NSString *,NSString *> * _Nonnull parameters) {
        
        NSLog(@"parameters==%@",parameters);
        UIViewController *v = [[NSClassFromString(parameters[@"controller"]) alloc] init];
        [self paramToVc:v param:parameters];
        [[self currentViewController] pushViewController:v animated:YES];
        return YES;
    }];
}
2.路由跳轉(zhuǎn)
-(void)paramToVc:(UIViewController *) v param:(NSDictionary<NSString *,NSString *> *)parameters{
    //        runtime將參數(shù)傳遞至需要跳轉(zhuǎn)的控制器
    unsigned int outCount = 0;
    objc_property_t * properties = class_copyPropertyList(v.class , &outCount);
    for (int i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        NSString *key = [NSString stringWithUTF8String:property_getName(property)];
        NSString *param = parameters[key];
        if (param != nil) {
            [v setValue:param forKey:key];
        }
    }
}

/**
 *          獲取當(dāng)前控制器
 */
-(UINavigationController *)currentViewController{
    
    HQTabBarController *HQTabBar = (HQTabBarController *)self.window.rootViewController;
    return HQTabBar.selectedViewController;
}


- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    NSLog(@"從哪個(gè)app跳轉(zhuǎn)而來 Bundle ID: %@", options[UIApplicationOpenURLOptionsSourceApplicationKey]);
    NSLog(@"URL scheme:%@", [url scheme]);
    
#pragma mark - JLRoutes(默認(rèn)的Scheme)
    
    return [[JLRoutes globalRoutes] routeURL:url];
}
- (void)urlClick{
    
    // 發(fā)送請求
    RACSignal *signal = [[[HQHomeViewModel alloc]init].requestCommand execute:@{@"code":@"Home"}];
    [signal subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
        NSString *customURL = @"HQMVVMRACRouter://NaviPush/TwoViewController?name=home&userId=10000&age=18&adbc=29";
        [[UIApplication sharedApplication]openURL:[NSURL URLWithString:customURL] options:@{UIApplicationOpenURLOptionsSourceApplicationKey : @YES} completionHandler:nil];        
    }];
}

希望各位大神指出不足的地方遇汞,大家共同進(jìn)步未妹!謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末空入,一起剝皮案震驚了整個(gè)濱河市络它,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歪赢,老刑警劉巖化戳,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異埋凯,居然都是意外死亡点楼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門白对,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掠廓,“玉大人,你說我怎么就攤上這事甩恼◇扒疲” “怎么了沉颂?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黄橘。 經(jīng)常有香客問我兆览,道長,這世上最難降的妖魔是什么塞关? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任抬探,我火速辦了婚禮,結(jié)果婚禮上帆赢,老公的妹妹穿的比我還像新娘小压。我一直安慰自己,他們只是感情好椰于,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布怠益。 她就那樣靜靜地躺著,像睡著了一般瘾婿。 火紅的嫁衣襯著肌膚如雪蜻牢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天偏陪,我揣著相機(jī)與錄音抢呆,去河邊找鬼。 笑死笛谦,一個(gè)胖子當(dāng)著我的面吹牛抱虐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饥脑,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼恳邀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了灶轰?” 一聲冷哼從身側(cè)響起谣沸,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎框往,沒想到半個(gè)月后鳄抒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椰弊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓤鼻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秉版。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茬祷,靈堂內(nèi)的尸體忽然破棺而出清焕,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布秸妥,位于F島的核電站滚停,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粥惧。R本人自食惡果不足惜键畴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望突雪。 院中可真熱鬧起惕,春花似錦、人聲如沸咏删。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽督函。三九已至嘀粱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辰狡,已是汗流浹背锋叨。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搓译,地道東北人悲柱。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像些己,于是被迫代替她去往敵國和親豌鸡。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 搭建app框架-MVVM+RAC+路由 項(xiàng)目的介紹 項(xiàng)目使用了ReactiveCocoa框架段标,實(shí)現(xiàn)了MVVM架構(gòu)涯冠,...
    WuZhuoXuan閱讀 1,456評論 3 13
  • 轉(zhuǎn)自http://casatwy.com/iosying-yong-jia-gou-tan-viewceng-de...
    嚴(yán)木木閱讀 1,520評論 1 8
  • 前天跟靜哥鬧矛盾了后來還是不了了之似乎是我的問題更大吧昨天給他送了水哈哈哈哈哈我第一次給男生送水噢
    在思念的人啊閱讀 100評論 0 0
  • 當(dāng)一陣風(fēng)吹來 風(fēng)箏飛上天空 為了你而祈禱 而祝福而感動(dòng) 終于你身影消失在 人海盡頭 才發(fā)現(xiàn) 笑著哭 最痛 <21'>
    Mr_Zoul閱讀 126評論 0 0
  • 阿基米德曾經(jīng)說過:“給我一個(gè)支點(diǎn),我就能撬起地球逼庞∩吒”這句話夸張確不失實(shí)際的凸顯了杠桿原理的厲害之處:只要有合適的工...
    Masai閱讀 749評論 0 6