開(kāi)發(fā)一個(gè)APP就如同建一棟高樓,我們建樓第一步是打地基,然后澆筑出樓體浇借,最后在樓體內(nèi)才能進(jìn)行星星點(diǎn)點(diǎn)的砌墻和裝飾。App也是一樣怕品,我們的知識(shí)技術(shù)就是如同是基礎(chǔ)妇垢,是開(kāi)發(fā)App不可獲取的因素,而項(xiàng)目的框架就如同樓體堵泽,樓體能決定樓房的樣式修己,外形,一旦樓體有問(wèn)題迎罗,那么大樓就有倒塌的風(fēng)險(xiǎn),一個(gè)App片仿,如果框架搭的有問(wèn)題纹安,那么做出來(lái)的App也是有問(wèn)題的,換而言之,一個(gè)架構(gòu)師框架是否搭的合理直接決定這個(gè)能走多遠(yuǎn)厢岂,最后我們?cè)贏pp里添加功能光督,就如同裝修,是我們開(kāi)發(fā)工程師的主戰(zhàn)場(chǎng)塔粒,下面就拿音樂(lè)播放器做示例介紹一下搭建框架结借。
拿到一個(gè)項(xiàng)目不要急著上手,首先要分析項(xiàng)目的大體模塊卒茬,需要實(shí)現(xiàn)的功能船老,比如百度音樂(lè)就分為我的,列表圃酵,分類(lèi)柳畔,榜單四部分。你可以就將他看做四塊郭赐,分割開(kāi)來(lái)薪韩,一個(gè)模塊一個(gè)模塊的實(shí)現(xiàn),其中播放界面是所有模塊都必須有的捌锭,所以俘陷,可以單獨(dú)把他提出來(lái)做。
創(chuàng)建四個(gè)文件夾观谦,分別用來(lái)存儲(chǔ)四個(gè)模塊的代碼岭洲,創(chuàng)建一個(gè)根控制器模塊文件夾用于構(gòu)筑框架
//根據(jù)視圖控制器名字和對(duì)應(yīng)的屬性添加導(dǎo)航欄視圖控制器至tabBarController
private func addChildViewControllerWith(controllerName:String ,title:String ,imageName:String){
//swift系統(tǒng)中系統(tǒng)會(huì)在類(lèi)名前面加上一個(gè)命名空間,命名空間可以通過(guò)NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"]來(lái)獲取
let nameSpace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
//根據(jù)一個(gè)類(lèi)名來(lái)加載類(lèi)objClass
let objClass:AnyObject = NSClassFromString("\(nameSpace).\(controllerName)")!
//將objClass轉(zhuǎn)化為真實(shí)的類(lèi)UITableViewController
let realClass = objClass as! UITableViewController.Type
//根據(jù)realClass實(shí)例化一個(gè)控制器對(duì)象
let controller = realClass.init(style: .Plain)
//創(chuàng)建導(dǎo)航欄控制器,并將controller設(shè)置為根視圖控制器
let navc = UINavigationController(rootViewController: controller)
//設(shè)置導(dǎo)航欄背景顏色
navc.navigationBar.barTintColor = UIColor.blackColor()
//設(shè)置導(dǎo)航欄文本顏色 titleTextAttributes文本屬性
navc.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]
//設(shè)置標(biāo)題
controller.tabBarItem.title = title;
controller.navigationItem.title = title;
controller.tabBarItem.image = UIImage(named: imageName)
//最后將導(dǎo)航欄視圖控制器添加到tabBarController上面
addChildViewController(navc)
}
在這里我將四個(gè)控制進(jìn)行了封裝坎匿,把控制器名盾剩,屬性提出來(lái)存入json文件,只需要輸入控制器的一些屬性就可以創(chuàng)建不同的控制器出來(lái)
然后定義一個(gè)方法替蔬,傳入屬性創(chuàng)建控制器告私,在viewDidload中調(diào)用即可
private func addchildviewcontrollers(){
let path = NSBundle.mainBundle().pathForResource("BaseTBC", ofType: "json")
//path為可選類(lèi)型,必須在使用時(shí)進(jìn)行解包
let data = NSData(contentsOfFile: path!)
//異常捕獲承桥,如果do出現(xiàn)錯(cuò)誤驻粟,會(huì)走catch里的方法
do {
let rootArray = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
for dict in rootArray as! [[String:String]] {
addChildViewControllerWith(dict["controllerName"]!, title: dict["title"]!, imageName: dict["imageName"]!)
}
}catch{
//默認(rèn)的一些操作
addChildViewControllerWith("HomePageController", title: "視聽(tīng)盛宴", imageName: "cm2_note_icn_listen@2x")
addChildViewControllerWith("TopListTableViewController", title: "排行榜", imageName: "cm2_note_icn_logo@2x")
addChildViewControllerWith("CategoryTableViewController", title: "分類(lèi)", imageName: "cm2_btm_icn_music_prs@2x")
addChildViewControllerWith("UserTableViewController", title: "我的", imageName: "ic_radiopage_personal@2x")
}
這樣播放器的框架就大體出來(lái)了,這四個(gè)控制器就代表著四個(gè)模塊凶异,你只需要在四個(gè)控制器中分別完成相應(yīng)的代碼實(shí)現(xiàn)每個(gè)模塊的步驟就行了
在進(jìn)行開(kāi)發(fā)時(shí)蜀撑,最好將功能性質(zhì)相近的類(lèi)放在一起,比如封裝工具整理在一個(gè)文件夾剩彬,頭文件pch文件放在一個(gè)文件夾酷麦,系統(tǒng)類(lèi)放一個(gè)文件夾。這么做不僅是為了別人能夠看得明白喉恋,也便于自己可以排查錯(cuò)誤沃饶。出現(xiàn)bug了也不需要整個(gè)工程的找母廷,只需要排查某個(gè)模塊的代碼,解決bug的時(shí)間快了糊肤,這樣我們的工作效率也可以大幅度的提高琴昆,利人利己。
封裝也是項(xiàng)目中非常重要的一點(diǎn)馆揉,也可以稱(chēng)之為工廠模式业舍,將一段很多地方都會(huì)寫(xiě)到的代碼塊封裝成一個(gè)方法,不同的參數(shù)提出來(lái)升酣,需要的時(shí)候只需要調(diào)用該方法就行了舷暮,節(jié)省時(shí)間,而且可以使自己的代碼不會(huì)那么冗余拗踢。
實(shí)際開(kāi)發(fā)時(shí)不要怕麻煩脚牍,能封裝的盡量封裝,這一刻你確實(shí)花費(fèi)了功夫巢墅,但是后面就輕松許多诸狭,而且還能提高自己的技術(shù),豈不是一舉兩得君纫?