這是一個(gè)新項(xiàng)目開(kāi)始的基本框架搭建(詳見(jiàn)我后面的github地址)
下面說(shuō)一下原則:
1.初始化項(xiàng)目
本項(xiàng)目主要是創(chuàng)建項(xiàng)目,添加PCH文件,導(dǎo)入常用第三方庫(kù),導(dǎo)入工具類(lèi),定制TabBar,定制NavBar,網(wǎng)絡(luò)層基本搭建與使用
2.整個(gè)項(xiàng)目的目錄結(jié)構(gòu)
項(xiàng)目主目錄下分為:Helper,Utils,General,Classes,Vendor,Resource,SupportingFiles 等庫(kù)
下面將說(shuō)下這些的區(qū)別:
1.其中Helper和Utils都相當(dāng)于工具類(lèi)庫(kù),只是Helper 更傾向于Tool的解決(如時(shí)間戳轉(zhuǎn)化,判斷是否是電話(huà)號(hào)碼等)
2.而Utils 更傾向View的定制,如Button,lable工廠(chǎng)方法的實(shí)現(xiàn)等
3.General 指的是總體上的,如AppDelegate,.pch文件,常用的宏定義.h文件件以及項(xiàng)目中用到的如Url縮寫(xiě)的.h和.m文件
4.Classes 指的是項(xiàng)目中用到的的功能分類(lèi)的所有的MVC架構(gòu)項(xiàng)目
5.Vendor 指的是第三方庫(kù)的導(dǎo)入(后期用cocoapods就不怎么用了)
6.Resource 指的是圖片等資源庫(kù)的導(dǎo)入
7.SupportingFiles? 指的是一些雜項(xiàng),幾乎用處不是太大的庫(kù)
3.自己定制Nav的使用
首先寫(xiě)的類(lèi)繼承 我的 CMBaseViewController 然后默認(rèn)使用我所設(shè)計(jì)的只有右側(cè)Nav沒(méi)有的狀態(tài)
分為以下層次實(shí)現(xiàn):
第一層次:如果只想改變item的顯示位置與個(gè)數(shù):就重寫(xiě)我的-(CMNavType)getNavType;方法,然后返回設(shè)置對(duì)應(yīng)的如下
CMNavTypeAll =0,? ? ? //左中右item都有
CMNavTypeNoRightItem ,//右item沒(méi)有
CMNavTypeOnlyTitle ,? //只有中間item有
CMNavTypeNone,? ? ? ? //沒(méi)有navbar
設(shè)置Nav顯示的對(duì)應(yīng)狀態(tài);
第二層次:如果想進(jìn)一步定制nav上某個(gè)item的名稱(chēng),則重寫(xiě)我的如下方法:
-(NSString *)customNavigationRightItemTitle;// 右側(cè)item文字變化
-(NSString *)customNavigationTitleViewTitleStr; // 左側(cè)item文字變化
返回您對(duì)應(yīng)的文字就可以了;
其中中間title,默認(rèn)用的就是您所在類(lèi)中的self.title設(shè)置的文字,所以一般不需要重寫(xiě)
第三層次:如果整個(gè)item您都不滿(mǎn)意,那么就重寫(xiě)以下的方法:
//定制導(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,必須重寫(xiě)下面的第二個(gè)方法,默認(rèn),點(diǎn)擊左側(cè)的item,是pop當(dāng)前的控制器,如果您想做自己的業(yè)務(wù)邏輯處理,請(qǐng)重寫(xiě)下面的第一個(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)單來(lái)說(shuō)其實(shí)就是,
首先,發(fā)送網(wǎng)絡(luò)請(qǐng)求的時(shí)候,包裝一個(gè)request對(duì)象要遵循我的一個(gè)request協(xié)議,之后返回?cái)?shù)據(jù),
其次,我再用我的包裝對(duì)象調(diào)用其遵循的協(xié)議方法,在協(xié)議方法里面再通過(guò)response對(duì)象遵循response協(xié)議,
再次,一方面調(diào)用response的協(xié)議方法去包裝我的response對(duì)象,另一方面通過(guò)調(diào)用在發(fā)送參數(shù)中的block對(duì)象達(dá)到數(shù)據(jù)(我要的數(shù)據(jù)或者錯(cuò)誤)傳給我的request對(duì)象的callBack的block,在里面通過(guò)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)求都要么再寫(xiě)一個(gè)Post方法。要么無(wú)法控制請(qǐng)求
//3.未來(lái)如果需要對(duì)請(qǐng)求的先后順序以及發(fā)出去請(qǐng)求的任務(wù)進(jìn)行 cancle的時(shí)候,也可以實(shí)現(xiàn)
不過(guò)它唯一的不算缺點(diǎn)是:就需要您和您的后臺(tái)定義好整個(gè)接口的架構(gòu),因?yàn)檎麄€(gè)項(xiàng)目返回參數(shù)的意思的架構(gòu)每個(gè)都必須一致。。。。
本來(lái)架構(gòu)的時(shí)候,還擔(dān)心有另一個(gè)缺點(diǎn):即那么多callback的實(shí)現(xiàn),會(huì)不會(huì)調(diào)用一下其他地方也都會(huì)響應(yīng),就會(huì)出問(wèn)題了,幸好,每個(gè)參數(shù)對(duì)象,如上的:
CMHttpRequestModel *model =[[CMHttpRequestModel alloc]init];
只有在自己的函數(shù)內(nèi)部可以有用,出了函數(shù)就自己銷(xiāo)毀了,真好!
不過(guò)還是要說(shuō)下它的缺點(diǎn),即您的request參數(shù)不能成為類(lèi)的成員屬性,更不能在一個(gè)方法內(nèi)發(fā)送2個(gè)request,切記!
5.關(guān)于如何開(kāi)啟新項(xiàng)目來(lái)對(duì)接我的空項(xiàng)目的問(wèn)題:
(1)新建自己的項(xiàng)目,然后項(xiàng)目工程配置更改如下:如橫豎屏問(wèn)題,版本問(wèn)題(最好支持7.0,因?yàn)樽畹桶姹緸?.0之后的上下可能有黑邊),支持的設(shè)備問(wèn)題(iPhone,iPad等),項(xiàng)目中增加文件前綴如:我的項(xiàng)目的PB開(kāi)頭:詳情見(jiàn)下面的圖片:
(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)目中 添加的類(lèi)型如下:Helper(側(cè)重tool),Utils(側(cè)重View),General,Classes,Vendor,Resource(可導(dǎo)可不導(dǎo),建議導(dǎo),后期可以刪除),以及我的空項(xiàng)目中的info.plist文件(我里面多了一些配置,所以請(qǐng)用我的靠譜?。?/p>
(4)修改PCH文件名字以及路徑:
查找方法如下:
添加的路徑示例如下:(注意其路徑中間要加上一個(gè)General)如下: $(SRCROOT)/您的項(xiàng)目名字/General/FarmAnimalPrefix.pch(您的pch文件名字)
(5)按照空項(xiàng)目中的引用類(lèi)庫(kù)導(dǎo)入對(duì)應(yīng)的類(lèi)庫(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,是否可以訪(fǎng)問(wèn)網(wǎng)絡(luò)等問(wèn)題(在info.plist中加key),也可以添加相關(guān)的權(quán)限(在info.plist中添加字段),詳見(jiàn)這篇簡(jiǎn)書(shū)文章
授權(quán)獲取用戶(hù)各種信息(地圖,相機(jī))的key
(7)編譯通過(guò)就愉快的寫(xiě)代碼吧! 其他就沒(méi)發(fā)現(xiàn)有什么問(wèn)題,如發(fā)現(xiàn)問(wèn)題,歡迎聯(lián)系QQ1824496534:備注:新項(xiàng)目。謝謝!
其他就沒(méi)發(fā)現(xiàn)有什么問(wèn)題,如發(fā)現(xiàn)問(wèn)題,歡迎聯(lián)系QQ1824496534:備注:新項(xiàng)目。謝謝!
我的空項(xiàng)目Demo地址
備注:以上項(xiàng)目中若引用他人的類(lèi)庫(kù),或者使用他人的方法,在此聲明,作為開(kāi)源項(xiàng)目,相互理解,謝謝理解