步驟:搭建基本環(huán)境 -> 展示子控制器 -> 項(xiàng)目分層 -> 增加導(dǎo)航功能 -> 增加導(dǎo)航欄按鈕。
搭建基本環(huán)境
該項(xiàng)目使用代碼搭建UI界面,所以在HMAppDelegate的didFinishLaunchingWithOptions方法中要?jiǎng)?chuàng)建窗口window并設(shè)置窗口的根控制器,如下:
刪除storyboard后要記得:
隱藏項(xiàng)目啟動(dòng)圖的狀態(tài)欄:
在項(xiàng)目啟動(dòng)完畢重新顯示狀態(tài)欄:
APP的界面:
展示子控制器
新建一個(gè)HMTabBarViewController類(lèi),在viewDidLoad方法中添加子控制器:
將添加子控制器的代碼抽取為方法addOneChirdVc:
注:在iOS7中,會(huì)對(duì)selectedImage的圖片進(jìn)行再次渲染為藍(lán)色瞳筏,所以要顯示原圖,就必須得告訴他:不要渲染牡昆。
有時(shí)候姚炕,Image在不同版本的iOS中會(huì)提供不同的圖片,他們的名稱(chēng)會(huì)有所不同丢烘,這時(shí)可對(duì)UIImage進(jìn)行擴(kuò)展:
APP的界面:
項(xiàng)目分層
HM微博項(xiàng)目按照的是功能模塊對(duì)項(xiàng)目分層柱宦,并在每個(gè)模塊里單獨(dú)使用MVC模式,分層圖如下:
增加導(dǎo)航功能(添加導(dǎo)航控制器)
tabBar控制器的子控制器必須包裝在導(dǎo)航控制器中播瞳,才能實(shí)現(xiàn)push等操作掸刊,如下:
在HMNavigationController類(lèi)中,重寫(xiě)pushViewController方法赢乓,攔截所有push進(jìn)來(lái)的子控制器忧侧,使push進(jìn)來(lái)的子控制器能夠隱藏tabBar低欄,如下:
在4個(gè)子控制器(繼承于UITableViewController)中分別實(shí)現(xiàn)數(shù)據(jù)源方法:
HMHomeViewController.h,
HMMessageViewController.h,
HMDiscoverViewController.h,
HMProfileViewController.h,
如下:
在HMTabBarViewController類(lèi)中骏全,修改addOneChirdVc方法,設(shè)置導(dǎo)航欄和tabBar欄上的title尼斧,如下:
APP的界面:
增加導(dǎo)航欄按鈕
在HMHomeViewController.h中姜贡,重寫(xiě)viewDidLoad方法,設(shè)置導(dǎo)航欄按鈕棺棵,如下:
設(shè)置導(dǎo)航欄按鈕在整個(gè)項(xiàng)目多處會(huì)用到楼咳,所以對(duì)其進(jìn)行封裝熄捍,
擴(kuò)展UIBarButtonItem類(lèi),如下:
除了最先push進(jìn)來(lái)的幾個(gè)控制器外母怜,要在所有push進(jìn)來(lái)的子控制器設(shè)置導(dǎo)航欄按鈕余耽,可以在HMNavigationController類(lèi)的pushViewController方法進(jìn)行設(shè)置,如下:
除了擴(kuò)展UIBarButtonItem類(lèi)設(shè)置導(dǎo)航欄按鈕苹熏,還有另外一種做法碟贾,自定義按鈕,如下:
這里的leftBtn.size的size用到了UIView類(lèi)的擴(kuò)展轨域。
在HMMessageViewController.h中袱耽,重寫(xiě)viewDidLoad方法,設(shè)置導(dǎo)航欄按鈕干发,如下:
在HMNavigationController類(lèi)中朱巨,重寫(xiě)類(lèi)方法initialize,通過(guò)appearance對(duì)象修改整個(gè)項(xiàng)目中所有“UIBarButtonItem”的樣式枉长,如下:
注:這里的UITextAttriTextColor冀续、UITextAttriTextFont屬性在iOS7.0之后已經(jīng)不建議使用。
APP的界面: