項(xiàng)目框架該如何搭建(Swift)

開發(fā)一個(gè)APP就如同建一棟高樓,我們建樓第一步是打地基,然后澆筑出樓體,最后在樓體內(nèi)才能進(jìn)行星星點(diǎn)點(diǎn)的砌墻和裝飾。App也是一樣,我們的知識(shí)技術(shù)就是如同是基礎(chǔ),是開發(fā)App不可獲取的因素,而項(xiàng)目的框架就如同樓體,樓體能決定樓房的樣式,外形,一旦樓體有問題,那么大樓就有倒塌的風(fēng)險(xiǎn),一個(gè)App,如果框架搭的有問題,那么做出來的App也是有問題的,換而言之,一個(gè)架構(gòu)師框架是否搭的合理直接決定這個(gè)能走多遠(yuǎn),最后我們?cè)贏pp里添加功能,就如同裝修,是我們開發(fā)工程師的主戰(zhàn)場(chǎng),下面就拿音樂播放器做示例介紹一下搭建框架。

拿到一個(gè)項(xiàng)目不要急著上手,首先要分析項(xiàng)目的大體模塊,需要實(shí)現(xiàn)的功能,比如百度音樂就分為我的,列表,分類,榜單四部分。你可以就將他看做四塊,分割開來,一個(gè)模塊一個(gè)模塊的實(shí)現(xiàn),其中播放界面是所有模塊都必須有的,所以,可以單獨(dú)把他提出來做。

創(chuàng)建四個(gè)文件夾,分別用來存儲(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ì)在類名前面加上一個(gè)命名空間,命名空間可以通過NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"]來獲取
let nameSpace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String

    //根據(jù)一個(gè)類名來加載類objClass
    let objClass:AnyObject = NSClassFromString("\(nameSpace).\(controllerName)")!
    //將objClass轉(zhuǎn)化為真實(shí)的類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)行了封裝,把控制器名,屬性提出來存入json文件,只需要輸入控制器的一些屬性就可以創(chuàng)建不同的控制器出來

然后定義一個(gè)方法,傳入屬性創(chuàng)建控制器,在viewDidload中調(diào)用即可
private func addchildviewcontrollers(){
let path = NSBundle.mainBundle().pathForResource("BaseTBC", ofType: "json")
//path為可選類型,必須在使用時(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: "視聽盛宴", imageName: "cm2_note_icn_listen@2x")
addChildViewControllerWith("TopListTableViewController", title: "排行榜", imageName: "cm2_note_icn_logo@2x")
addChildViewControllerWith("CategoryTableViewController", title: "分類", imageName: "cm2_btm_icn_music_prs@2x")
addChildViewControllerWith("UserTableViewController", title: "我的", imageName: "ic_radiopage_personal@2x")
}

這樣播放器的框架就大體出來了,這四個(gè)控制器就代表著四個(gè)模塊,你只需要在四個(gè)控制器中分別完成相應(yīng)的代碼實(shí)現(xiàn)每個(gè)模塊的步驟就行了

在進(jìn)行開發(fā)時(shí),最好將功能性質(zhì)相近的類放在一起,比如封裝工具整理在一個(gè)文件夾,頭文件pch文件放在一個(gè)文件夾,系統(tǒng)類放一個(gè)文件夾。這么做不僅是為了別人能夠看得明白,也便于自己可以排查錯(cuò)誤。出現(xiàn)bug了也不需要整個(gè)工程的找,只需要排查某個(gè)模塊的代碼,解決bug的時(shí)間快了,這樣我們的工作效率也可以大幅度的提高,利人利己。
封裝也是項(xiàng)目中非常重要的一點(diǎn),也可以稱之為工廠模式,將一段很多地方都會(huì)寫到的代碼塊封裝成一個(gè)方法,不同的參數(shù)提出來,需要的時(shí)候只需要調(diào)用該方法就行了,節(jié)省時(shí)間,而且可以使自己的代碼不會(huì)那么冗余。

實(shí)際開發(fā)時(shí)不要怕麻煩,能封裝的盡量封裝,這一刻你確實(shí)花費(fèi)了功夫,但是后面就輕松許多,而且還能提高自己的技術(shù),豈不是一舉兩得?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容