這是一個(gè)新項(xiàng)目開始的基本框架搭建(詳見我后面的github地址)
下面說一下原則:
1.初始化項(xiàng)目
本項(xiàng)目主要是創(chuàng)建項(xiàng)目极阅,添加PCH文件丁恭,導(dǎo)入常用第三方庫(kù)粤咪,導(dǎo)入工具類,定制TabBar沐寺,定制NavBar林艘,網(wǎng)絡(luò)層基本搭建與使用
2.整個(gè)項(xiàng)目的目錄結(jié)構(gòu)
項(xiàng)目主目錄下分為:Helper,Utils混坞,General,Classes,Vendor,Resource,SupportingFiles 等庫(kù)
下面將說下這些的區(qū)別:
1.其中Helper和Utils都相當(dāng)于工具類庫(kù)狐援,只是Helper 更傾向于Tool的解決(如時(shí)間戳轉(zhuǎn)化,判斷是否是電話號(hào)碼等)
2.而Utils 更傾向View的定制究孕,如Button啥酱,lable工廠方法的實(shí)現(xiàn)等
3.General 指的是總體上的,如AppDelegate,.pch文件,常用的宏定義.h文件件以及項(xiàng)目中用到的如Url縮寫的.h和.m文件
4.Classes 指的是項(xiàng)目中用到的的功能分類的所有的MVC架構(gòu)項(xiàng)目
5.Vendor 指的是第三方庫(kù)的導(dǎo)入(后期用cocoapods就不怎么用了)
6.Resource 指的是圖片等資源庫(kù)的導(dǎo)入
7.SupportingFiles? 指的是一些雜項(xiàng)厨诸,幾乎用處不是太大的庫(kù)
3.自己定制Nav的使用
首先寫的類繼承 我的 CMBaseViewController 然后默認(rèn)使用我所設(shè)計(jì)的只有右側(cè)Nav沒有的狀態(tài)
分為以下層次實(shí)現(xiàn):
第一層次:如果只想改變item的顯示位置與個(gè)數(shù):就重寫我的-(CMNavType)getNavType;方法镶殷,然后返回設(shè)置對(duì)應(yīng)的如下
CMNavTypeAll =0,? ? ? //左中右item都有
CMNavTypeNoRightItem ,//右item沒有
CMNavTypeOnlyTitle ,? //只有中間item有
CMNavTypeNone,? ? ? ? //沒有navbar
設(shè)置Nav顯示的對(duì)應(yīng)狀態(tài);
第二層次:如果想進(jìn)一步定制nav上某個(gè)item的名稱微酬,則重寫我的如下方法:
-(NSString *)customNavigationRightItemTitle;// 右側(cè)item文字變化
-(NSString *)customNavigationTitleViewTitleStr; // 左側(cè)item文字變化
返回您對(duì)應(yīng)的文字就可以了绘趋;
其中中間title,默認(rèn)用的就是您所在類中的self.title設(shè)置的文字颗管,所以一般不需要重寫
第三層次:如果整個(gè)item您都不滿意陷遮,那么就重寫以下的方法:
//定制導(dǎo)航欄上的titleView
- (void)customNavigationTitleView;
//定制導(dǎo)航欄左邊的按鈕
- (void)customNavigationLeftItem;
//定制導(dǎo)航欄右邊的按鈕
- (void)customNavigationRighItem;
自己定制自己的item,多爽垦江!
注意:以下2個(gè)方法為nav的左右Item的點(diǎn)擊后的實(shí)現(xiàn)帽馋,默認(rèn),如果有右側(cè)item比吭,必須重寫下面的第二個(gè)方法绽族,默認(rèn),點(diǎn)擊左側(cè)的item衩藤,是pop當(dāng)前的控制器吧慢,如果您想做自己的業(yè)務(wù)邏輯處理,請(qǐng)重寫下面的第一個(gè)方法慷彤。
- (void)navigationLeftButtonClick:(id)sender;
- (void)navigationRightButtonClick:(id)sender;
4.網(wǎng)絡(luò)架構(gòu)的優(yōu)缺點(diǎn)分析
具體網(wǎng)絡(luò)架構(gòu)其實(shí)不是太難娄蔼,一般都可以看得懂怖喻,簡(jiǎn)單來說其實(shí)就是底哗,
首先,發(fā)送網(wǎng)絡(luò)請(qǐng)求的時(shí)候锚沸,包裝一個(gè)request對(duì)象要遵循我的一個(gè)request協(xié)議跋选,之后返回?cái)?shù)據(jù),
其次哗蜈,我再用我的包裝對(duì)象調(diào)用其遵循的協(xié)議方法前标,在協(xié)議方法里面再通過response對(duì)象遵循response協(xié)議坠韩,
再次,一方面調(diào)用response的協(xié)議方法去包裝我的response對(duì)象炼列,另一方面通過調(diào)用在發(fā)送參數(shù)中的block對(duì)象達(dá)到數(shù)據(jù)(我要的數(shù)據(jù)或者錯(cuò)誤)傳給我的request對(duì)象的callBack的block只搁,在里面通過response對(duì)象的一些屬性,簡(jiǎn)單判斷就實(shí)現(xiàn)了俭尖,如下是我的網(wǎng)絡(luò)請(qǐng)求示例:
//1. 參數(shù)初始化
CMHttpRequestModel *model =[[CMHttpRequestModel alloc]init];
NSDictionary *paramsDic =@{@"qq":@"1824496534"};
// 2.參數(shù)包裝
model.appendUrl =kTestQQGetNickNameURL;
model.paramDic =[paramsDic mutableCopy];
// 3.返回?cái)?shù)據(jù)處理
model.callback =^(CMHttpResponseModel *result, NSError *error) {
if (result.isSucc) {// 成功,做自己的邏輯
DDLog(@"%@",result.data);
mAlertView(@"提示", @"網(wǎng)絡(luò)請(qǐng)求成功");
}else {// 失敗,彈框提示
mAlertView(@"提示", result.alertMsg);
DDLog(@"%@",result.error);
}
};
//4. 發(fā)送網(wǎng)絡(luò)請(qǐng)求
[[CMHTTPSessionManager sharedHttpSessionManager] sendHttpRequestParam:model];
如此? so easy氢惋!
與傳統(tǒng)的定義成功block和失敗block或者代理去告訴我成功或錯(cuò)誤的邏輯處理,它有明顯的以下優(yōu)點(diǎn):
//1.不 care 錯(cuò)誤的內(nèi)容處理稽犁,初次解析什么的代碼全都放在response內(nèi)部去實(shí)現(xiàn)
//2.不 care每個(gè)請(qǐng)求都要么再寫一個(gè)Post方法焰望。要么無法控制請(qǐng)求
//3.未來如果需要對(duì)請(qǐng)求的先后順序以及發(fā)出去請(qǐng)求的任務(wù)進(jìn)行 cancle的時(shí)候,也可以實(shí)現(xiàn)
不過它唯一的不算缺點(diǎn)是:就需要您和您的后臺(tái)定義好整個(gè)接口的架構(gòu)已亥,因?yàn)檎麄€(gè)項(xiàng)目返回參數(shù)的意思的架構(gòu)每個(gè)都必須一致熊赖。。虑椎。震鹉。
本來架構(gòu)的時(shí)候,還擔(dān)心有另一個(gè)缺點(diǎn):即那么多callback的實(shí)現(xiàn)捆姜,會(huì)不會(huì)調(diào)用一下其他地方也都會(huì)響應(yīng)足陨,就會(huì)出問題了,幸好娇未,每個(gè)參數(shù)對(duì)象墨缘,如上的:
CMHttpRequestModel *model =[[CMHttpRequestModel alloc]init];
只有在自己的函數(shù)內(nèi)部可以有用,出了函數(shù)就自己銷毀了零抬,真好镊讼!
不過還是要說下它的缺點(diǎn),即您的request參數(shù)不能成為類的成員屬性平夜,更不能在一個(gè)方法內(nèi)發(fā)送2個(gè)request蝶棋,切記!
5.關(guān)于如何開啟新項(xiàng)目來對(duì)接我的空項(xiàng)目的問題:
(1)新建自己的項(xiàng)目忽妒,然后項(xiàng)目工程配置更改如下:如橫豎屏問題玩裙,版本問題(最好支持7.0,因?yàn)樽畹桶姹緸?.0之后的上下可能有黑邊)段直,支持的設(shè)備問題(iPhone,iPad等)吃溅,項(xiàng)目中增加文件前綴如:我的項(xiàng)目的PB開頭:詳情見下面的圖片:
(2)刪除并移動(dòng)自己的新項(xiàng)目?
刪除:刪除新項(xiàng)目的AppDelegate.h 和.m 文件,ViewController.h 和.m鸯檬,Main.storyboard决侈,LaunchScreen.storyboard,main.m以及Assets.xcassets和info.plist 等文件
移動(dòng):移動(dòng)其他 Supporting Files 的文件夾到根目錄文件夾中
(3)添加空項(xiàng)目中的庫(kù)到新項(xiàng)目中 添加的類型如下:Helper(側(cè)重tool)喧务,Utils(側(cè)重View)赖歌,General枉圃,Classes,Vendor庐冯,Resource(可導(dǎo)可不導(dǎo)孽亲,建議導(dǎo),后期可以刪除),以及我的空項(xiàng)目中的info.plist文件(我里面多了一些配置展父,所以請(qǐng)用我的靠譜D帧)
(4)修改PCH文件名字以及路徑:
查找方法如下:
添加的路徑示例如下:(注意其路徑中間要加上一個(gè)General)如下: $(SRCROOT)/您的項(xiàng)目名字/General/FarmAnimalPrefix.pch(您的pch文件名字)
(5)按照空項(xiàng)目中的引用類庫(kù)導(dǎo)入對(duì)應(yīng)的類庫(kù)
1.第三方庫(kù)中有fmdb的:導(dǎo)入libsqlite3.tbd 庫(kù)
2.有分享的,按照ShareSDK的要求導(dǎo)入對(duì)應(yīng)的庫(kù)(我的項(xiàng)目暫時(shí)不需要犯祠,如需要連接為:ShareSDK分享集成導(dǎo)入的庫(kù))
(6)需要適當(dāng)確定是否是否支持ipv6旭等,是否可以訪問網(wǎng)絡(luò)等問題(在info.plist中加key),也可以添加相關(guān)的權(quán)限(在info.plist中添加字段)衡载,詳見這篇簡(jiǎn)書文章
授權(quán)獲取用戶各種信息(地圖搔耕,相機(jī))的key
(7)編譯通過就愉快的寫代碼吧! 其他就沒發(fā)現(xiàn)有什么問題痰娱,如發(fā)現(xiàn)問題弃榨,歡迎聯(lián)系QQ1824496534:備注:新項(xiàng)目。謝謝梨睁!
其他就沒發(fā)現(xiàn)有什么問題鲸睛,如發(fā)現(xiàn)問題,歡迎聯(lián)系QQ1824496534:備注:新項(xiàng)目坡贺。謝謝官辈!
我的空項(xiàng)目Demo地址
備注:以上項(xiàng)目中若引用他人的類庫(kù),或者使用他人的方法遍坟,在此聲明拳亿,作為開源項(xiàng)目,相互理解愿伴,謝謝理解