前言
距離VTMagic正式開源已經(jīng)過去整整一個(gè)月贝攒,這短短的時(shí)間里收獲了九百多顆star幻赚,在GitHub月榜Objective-C語言中覆享,其排名基本一直維持在前三靶橱。目前第一是雅虎的AppDevKit,第三名是大家熟知的AFNetworking路捧。坦白說关霸,這樣的成績(jī)完全出乎我的預(yù)料,大家對(duì)VTMagic的認(rèn)可讓我滿懷欣喜的同時(shí)也變得有些忐忑不安杰扫。針對(duì)VTMagic的改進(jìn)队寇,我慢慢開始變得謹(jǐn)慎,每一次改動(dòng)都需要不斷測(cè)試驗(yàn)證章姓,以保證其可以正常運(yùn)行佳遣。個(gè)人的力量是微小的,希望能與各位江湖高手一起完善VTMagic凡伊,參與開源項(xiàng)目將會(huì)是一件很有趣的事零渐!
正文
在上一篇文章中,已經(jīng)初步介紹了VTMagic的部分特性和基本使用系忙,同時(shí)也收到了不少反饋诵盼,本文將進(jìn)一步介紹VTMagic使用中的一些要點(diǎn)和技巧,并針對(duì)部分反饋?zhàn)鲆恍┛偨Y(jié)银还,希望對(duì)各位開發(fā)者能有所幫助风宁。
重用機(jī)制
該機(jī)制是整個(gè)框架的核心,它保證了單個(gè)模塊中即使有數(shù)十上百個(gè)頁面蛹疯,應(yīng)用內(nèi)存依舊可控戒财,不會(huì)出現(xiàn)突然暴漲,甚至被系統(tǒng)強(qiáng)制殺死的情況捺弦。在預(yù)加載機(jī)制下饮寞,VTMagic默認(rèn)會(huì)加載當(dāng)前頁面和下一個(gè)頁面,也就是說同時(shí)被加載的頁面可能有兩個(gè)羹呵,也可能有三個(gè)骂际,具體視當(dāng)前頁面的位置而定。若當(dāng)前頁面處于兩側(cè)邊緣冈欢,則被加載的頁面有兩個(gè)歉铝,若在中間則會(huì)有三個(gè)頁面被加載。這也是有些開發(fā)者反饋的viewControllerAtPage:
方法會(huì)被多次調(diào)用的原因凑耻。
而之前加載的其它頁面則會(huì)在不需要時(shí)被移除太示,并放到內(nèi)部緩存池中等待重用柠贤。當(dāng)某個(gè)頁面即將被重用時(shí),方法vtm_prepareForReuse
會(huì)被調(diào)用类缤,該方法屬于協(xié)議VTMagicReuseProtocol
臼勉,需要開發(fā)者在各子頁面中手動(dòng)重寫,通巢腿酰可以在這個(gè)方法中清除頁面舊數(shù)據(jù)宴霸、修正頁面偏移等。
需要說明的是膏蚓,可以通過將屬性needPreloading
置為NO
來關(guān)閉預(yù)加載機(jī)制瓢谢。在預(yù)加載機(jī)制關(guān)閉的情況下,VTMagic只會(huì)加載當(dāng)前顯示的頁面驮瞧,而不再預(yù)加載下一頁氓扛,同時(shí)點(diǎn)擊菜單項(xiàng)切換時(shí),頁面也不再有切換動(dòng)畫论笔。
生命周期方法
當(dāng)某個(gè)子頁面出現(xiàn)或消失時(shí)采郎,VTMagic能準(zhǔn)確觸發(fā)其相應(yīng)的生命周期方法(viewWillAppear:
等)。如果該頁面是可重用的狂魔,則可以將網(wǎng)絡(luò)請(qǐng)求放在viewDidAppear:
方法中蒜埋,然后根據(jù)menuInfo.menuId
去請(qǐng)求當(dāng)前菜單項(xiàng)的對(duì)應(yīng)數(shù)據(jù),作為必要的補(bǔ)充最楷,請(qǐng)求時(shí)應(yīng)該判斷一下頁面是否已經(jīng)有了最新數(shù)據(jù)理茎;與之相對(duì)的,我們應(yīng)該在viewWillDisappear:
或viewDidDisappear:
方法中將網(wǎng)絡(luò)請(qǐng)求取消掉管嬉,以免被重用后頁面數(shù)據(jù)錯(cuò)亂和造成不必要的流量開銷皂林。而如果頁面是唯一的,即不會(huì)有其它頁面重用該頁面蚯撩,這種情況下也可以將網(wǎng)絡(luò)請(qǐng)求放在viewDidLoad
方法中础倍,特別是當(dāng)預(yù)加載邏輯關(guān)閉時(shí),即needPreloading
為NO
時(shí)胎挎。
談到網(wǎng)絡(luò)請(qǐng)求就不得不說加載本地?cái)?shù)據(jù)的問題沟启。針對(duì)可重用頁面,當(dāng)其menuInfo
改變時(shí)(可重寫menuInfo
的setter
方法)犹菇,我們通常需要為頁面加載緩存數(shù)據(jù)德迹,以保證滑動(dòng)切換時(shí)能有良好的用戶體驗(yàn)。關(guān)于緩存數(shù)據(jù)揭芍,可以是從數(shù)據(jù)庫(kù)中讀取胳搞,也可以直接將之前的頁面數(shù)據(jù)保存到某個(gè)變量中以供后來使用,甚至可以從plist文件中獲得,根據(jù)具體情況可靈活選擇肌毅。
刷新和切換
-
reloadData
方法會(huì)重新加載所有頁面筷转; -
reloadDataToPage:
方法會(huì)在重新加載所有頁面時(shí),同步聚焦到指定頁面悬而; -
switchToPage:animated:
方法用于在需要的時(shí)候切換到指定頁面呜舒。
以上三個(gè)方法的使用場(chǎng)景各有不同,可根據(jù)具體情況靈活使用笨奠。需要注意的是袭蝗,應(yīng)盡可能避免在viewWillAppear:
和 viewWillDisappear:
方法中調(diào)用以上方法,否則會(huì)造成某些頁面的生命周期方法不能準(zhǔn)確觸發(fā)般婆,控制臺(tái)會(huì)輸出類似Unbalanced calls to begin/end appearance transitions for <VTGridViewController: 0x7fc3e2d43a70>
的警告呻袭。這是因?yàn)檫@時(shí)的currentViewController
與之后viewDidAppear:
、viewDidDisappear:
方法中的currentViewController
不是同一個(gè)腺兴,也就是說currentViewController
的生命周期沒有完整觸發(fā)。而在viewDidLoad
廉侧、viewDidAppear:
页响、viewDidDisappear:
或者其它地方調(diào)用以上方法都是沒問題的。
多層嵌套
VTMagic支持多層嵌套段誊,也就是在子頁面中可以再嵌套一個(gè)VTMagic闰蚕,類似需求一般常見于iPad項(xiàng)目,其使用原則與單個(gè)VTMagic的使用一致连舍,并無其它明顯區(qū)別没陡。
跨層級(jí)業(yè)務(wù)處理
為方便跨層級(jí)處理業(yè)務(wù),VTMagic提供了在子頁面中直接訪問上層最近主控制器的方法self.magicController
索赏,甚至你可以進(jìn)一步通過self.magicController. magicView
拿到當(dāng)前的magicView
盼玄。當(dāng)然,你也可以通過self.vtm_pageIndex
獲取當(dāng)前頁面的索引潜腻。同樣的埃儿,在主控制器中可以通過self.currentViewController
和self.currentPage
獲取當(dāng)前顯示的頁面和索引。
自定義組件
VTMagic中幾乎所有組件都支持自定義融涣,框架本身主要提供核心的切換邏輯處理和良好的性能管理童番,開發(fā)者可根據(jù)業(yè)務(wù)需要自定義對(duì)外接口提供的任意組件。
自定義menuItem
你可以在menuItemAtIndex:
方法中返回自定義的任意menuItem
威鹿,只要它是UIBUtton
類型即可剃斧。menuItem
是頂部菜單欄中的單個(gè)菜單項(xiàng),其可以支持文本忽你、圖片幼东、文本+圖片等幾種格式。可見菜單欄文本的顏色和字體就是通過修改menuItem
的文本和顏色來實(shí)現(xiàn)的筋粗,VTMagic本身并不直接提供修改文本和字體的接口策橘。
自定義菜單欄兩側(cè)視圖
可以通過屬性leftNavigatoinItem
和rightNavigatoinItem
在頂部菜單欄兩側(cè)添加任意視圖,需要注意的是娜亿,被添加的視圖應(yīng)該有確定的size丽已,然后VTMagic會(huì)自動(dòng)完成相應(yīng)布局。
自定義sliderView
由于需求各有不同买决,VTMagic提供的下劃線沛婴、氣泡等樣式可能都不是你想要的,這種情況下你可以通過setSliderView:
方法來自定義任意樣式的sliderView
督赤,比如類似demo中的顯示一個(gè)三角標(biāo)識(shí)等嘁灯。
自定義separatorView
如果需要,你甚至可以通過方法setSeparatorView:
自定義頂部導(dǎo)航分割線躲舌,不過一般情況下應(yīng)該是沒這必要的丑婿。
其它
-
VTMagic中有許多有意思的小feature,比如
scrollEnabled
没卸、switchEnabled
羹奉、switchEvent
以及navigationInset
等等,詳情請(qǐng)參見VTMagicView.h
文件约计。 - 關(guān)于VTMagic的所有重要修改都會(huì)記錄在GitHub上的變更日志中诀拭,想知道每個(gè)版本都有哪些更新,可查閱該文件煤蚌。
結(jié)束語
最后耕挨,按照慣例,如果你喜歡這個(gè)輪子尉桩,請(qǐng)留下一顆star筒占,這是對(duì)作者最大的鼓勵(lì)和支持,拜謝V├纭8陈痢!假如你有更好的想法或方案沽瘦,也歡迎提交pull request8锕恰!析恋!GitHub地址