簡(jiǎn)述
基于UICollectionView的列表的實(shí)現(xiàn)琉用,看似復(fù)雜晶密,但分解之后就是如下的四個(gè)部分的文件瞬女,而且為了方便重用虐秋,做了更為細(xì)化的分解榕茧。
1. 配置文件
-
Layout
主要實(shí)現(xiàn)list中cell,footer客给、header用押、section的布局。即自定義的layout(系統(tǒng)提供flowlayout亦可使用)
增刪cell時(shí)的動(dòng)畫(huà)設(shè)置
-
DataSource
- 數(shù)據(jù)源靶剑,list展示的數(shù)據(jù)在此文件中保存(以數(shù)組的形式)
- 實(shí)現(xiàn)
UICollectionViewDataSource
協(xié)議,將必須的數(shù)據(jù)源方法通過(guò)block的形式返回蜻拨,便于在引用處設(shè)置 - 實(shí)現(xiàn)插入池充、刪除、reload等方法缎讼。引用處只需簡(jiǎn)單調(diào)用即可
-
Delegate
- 事件源:將點(diǎn)擊纵菌、display、size返回等事件以block回調(diào)至引用處休涤,方便配置
- 實(shí)現(xiàn)
LayoutDelegate
協(xié)議方法,提供Layout必要的布局?jǐn)?shù)據(jù)
-
LayoutDelegate
- 通常放在
Layout
文件中笛辟,該協(xié)議繼承自UICollectionViewDelegate
協(xié)議 - 提供Layout必須的或者非必須的資源功氨,如用來(lái)獲取cell寬高、footer和header的size屬性等
- 通常放在
2. 界面相關(guān)
-
cellProtocol:
- 自定義cell時(shí)必須實(shí)現(xiàn)該協(xié)議中的方法
- 提供cell的數(shù)據(jù)更新手幢、size(高度或者寬度)計(jì)算捷凄、cell的點(diǎn)擊事件(根據(jù)mvvm架構(gòu),此處不應(yīng)該有此功能围来,但未找到更合適的方案)
- 若cell中有一些單例的方法跺涤,如cell中點(diǎn)擊頭像,可以具體問(wèn)題具體分析(可在該cell中添加點(diǎn)擊頭像方法监透,不必在協(xié)議中添加)
- 具體方法:
- (void)alpCellDidSelected:(id)model target:(id)target indexPath:(NSIndexPath *)indexPath
優(yōu)化:- (void)alpCellDidSelected:(id)model target:(id)target indexPath:(NSIndexPath *)indexPath info:(id)info
此處添加一個(gè)泛型info桶错,可以實(shí)現(xiàn)一些特殊信息的傳遞。未驗(yàn)證可行性
-
reuseViewProtocol
- 自定義reuseView時(shí)需要實(shí)現(xiàn)該協(xié)議方法胀蛮,具體方案同cell
-
modelProtocol
- model文件必須實(shí)現(xiàn)該協(xié)議院刁。
- 目前該協(xié)議中只有兩個(gè)宏:```typedef uint64_t (^fetchFirstData)(id objData,ALPHttpError *error,BOOL hasMore);
typedef void (^fetchNextData)(id objData,ALPHttpError *error,BOOL hasMore);
3. 數(shù)據(jù)獲取
- collectionView category:創(chuàng)建一個(gè)擴(kuò)展,該擴(kuò)展中實(shí)現(xiàn)上拉粪狼、下拉刷新的控件和事件
- 創(chuàng)建具體model的擴(kuò)展退腥,實(shí)現(xiàn)數(shù)據(jù)網(wǎng)絡(luò)請(qǐng)求
4. 特殊情況
- 關(guān)于header或者footer執(zhí)行時(shí),在
DataSource
中不調(diào)用數(shù)據(jù)源委托方法再榄,猜測(cè)是apple的bug狡刘。解決方案是創(chuàng)建DataSource的擴(kuò)展,在擴(kuò)展中復(fù)寫(xiě)該方法即可實(shí)現(xiàn)調(diào)用困鸥。
具體結(jié)構(gòu)如下圖:
使用方法:
參見(jiàn)示例:
截圖:
由上述使用的方式可以看到代碼量還是存在的嗅蔬,只不過(guò)之前委托代理的形式現(xiàn)在替換成了block的方式。
優(yōu)點(diǎn)是多個(gè)列表的情況只需要復(fù)制一份窝革,簡(jiǎn)單的修改cell和model即可购城;
缺點(diǎn)是時(shí)刻要注意block的循環(huán)引用問(wèn)題。
若是在多section的情況下虐译,則需要在block中添加對(duì)應(yīng)的section選項(xiàng)即可瘪板,作為標(biāo)識(shí)。并且目前如獲取cell的數(shù)據(jù)源方法我都做成了在引用處返回的形式漆诽,這樣同時(shí)也實(shí)現(xiàn)了一個(gè)列表支持不同類型cell的功能侮攀。
總結(jié):這種方式的封裝锣枝,其實(shí)和調(diào)用委托方法節(jié)省不了多少代碼量,但是在重用性上還是便利很多兰英。所以找到它們的平衡點(diǎn)很重要撇叁。
不足之處,還望給予指正畦贸,謝謝