
We grow neither better nor worse as we grow old but more like ourselves.( M. L. Becker )
隨著年齡的增長(zhǎng),我們并沒(méi)有變得更好也沒(méi)有變得更壞,而是變得更象我們自己(貝克爾)
下載地址:Github
層級(jí)說(shuō)明:
此控件為UIView,分三個(gè)部分,頂部為headerView,setter方法設(shè)置,中間的title視圖為可以滾動(dòng)的scrollView,可以設(shè)置標(biāo)題選擇和未選擇的顏色,底部為collectionView嵌套的tableView,而tableView為用戶(hù)注冊(cè)的類(lèi)名加載而來(lái),需要繼承HHBaseTableView,重寫(xiě)父類(lèi)的一些方法,用戶(hù)只需要管理headerView和tableView即可,詳見(jiàn)Demo.

該視圖包含三個(gè)小模塊:
- BaseConstruct :可選8中waitHud樣式,提醒文字,錯(cuò)誤頁(yè)面;
- RefreshManager :包含三種刷新樣式,KVO監(jiān)聽(tīng),使用簡(jiǎn)單;
- LinkageView :指示器聯(lián)動(dòng)
傳值:
-
事件傳遞 :
傳值方式為:KVC字典傳值,控制器定義Block,以key值區(qū)分事件,保存在HHHoverLinkageView的actionDict中,父視圖負(fù)責(zé)分發(fā)到各個(gè)子視圖,子視圖各個(gè)以key值獲得自己需要調(diào)用的Blcok。
@property (nonatomic, strong) NSMutableDictionary *actionDict;//存儲(chǔ)block,給子視圖傳遞事件
AddBlockAction(_hoverView.actionDict, HeaderViewButtonClick, ^(NSString *text){
[wSelf showText:text];
});
-
值傳遞 :
主視圖中暴露了二個(gè)屬性,用戶(hù)根據(jù)需要設(shè)置數(shù)據(jù)
@property (nonatomic, copy) NSDictionary *dataDict;//需要傳遞給子視圖tableView的字典
@property (nonatomic, copy) NSArray *dataArray;//需要傳遞給子視圖tableView的數(shù)組
用戶(hù)自定義的tableView只需要重寫(xiě)下面方法即可獲得數(shù)據(jù)
@property (nonatomic, copy) NSDictionary *dataDict;//子類(lèi)重寫(xiě) "setter" 獲得數(shù)據(jù)
@property (nonatomic, copy) NSArray *dataArray;//子類(lèi)重寫(xiě) "setter" 獲得數(shù)據(jù)
@property (nonatomic, strong) NSIndexPath *indexPath;//子類(lèi)重寫(xiě)"setter" 獲得索引
常用方法:
_hoverView.linkageView.titleArray = self.titleArray;//決定中間title的標(biāo)題
_hoverView.tableViewClassName = NSStringFromClass([HHHoverTableView class]);//注冊(cè)類(lèi)名需要繼承"HHBaseTableView",加載用戶(hù)自定義的tableView
知識(shí)點(diǎn):
-
1 :
tableView的contentOffset實(shí)際上就是它的bounds,只需要在scrollViewDidScroll中時(shí)時(shí)改變?yōu)?,即是:scrollView.contentOffset = CGPointZero就可以控制它父視圖的坐標(biāo),同時(shí)加上一系列的邊界監(jiān)測(cè),就可實(shí)現(xiàn)上述效果。 -
2 :關(guān)鍵字
copy、assign、weak和strong的靈活運(yùn)用
對(duì)于以下兩種是沒(méi)有太多意義的,每次賦值都會(huì)copy一個(gè)不可變對(duì)象設(shè)置屬性,如果使用插入刪除編譯時(shí)不會(huì)報(bào)錯(cuò),但運(yùn)行時(shí)會(huì)導(dǎo)致崩潰。
@property (nonatomic, copy) NSMutableDictionary *dictM;
@property (nonatomic, copy) NSMutableArray *arrayM;
對(duì)于以下類(lèi)型的屬性,非一致類(lèi)型,都會(huì)拷貝copy一個(gè)不可變對(duì)象設(shè)置屬性,否則直接引用
@property (nonatomic, copy) NSDictionary *dict;
@property (nonatomic, copy) NSArray *array;
copy相對(duì)于strong它是安全的,strong為引用性,指針可指向任意對(duì)象,造成不安全的訪問(wèn)。
weak和assign一個(gè)對(duì)象銷(xiāo)毀時(shí)自動(dòng)賦值nil,一個(gè)不會(huì)。一般對(duì)象解循環(huán)引用的時(shí)候用weak,而assign常用語(yǔ)基礎(chǔ)類(lèi)型。下面舉一個(gè)assign不常用到的例子,也是在寫(xiě)此Demo中遇到的。
A對(duì)象是一個(gè)視圖,擁有子視圖屬性B,子視圖B擁有對(duì)象屬性C,C通過(guò)KVO監(jiān)聽(tīng)B屬性的變化。為了保持解耦合,我把B傳入C,Cweak引用B設(shè)為自己的屬性D,在Cdealloc中,讓D移除觀察者C。

原則上看是沒(méi)有任何問(wèn)題的,實(shí)際在演示中發(fā)現(xiàn),B視圖會(huì)先銷(xiāo)毀,而后C才會(huì)銷(xiāo)毀,當(dāng)B銷(xiāo)毀后,C的屬性D也會(huì)指向
nil,在Cdealloc中,無(wú)法移除觀察者,導(dǎo)致程序崩潰,此時(shí)用assign,卻能解決這個(gè)問(wèn)題,雖然B銷(xiāo)毀了,C依然可以拿到地址,移除觀察者,正常銷(xiāo)毀。最后:
由于本人目前知識(shí)儲(chǔ)備有限,以上說(shuō)明中,也許會(huì)存在一些錯(cuò)誤的描述和認(rèn)識(shí),還希望發(fā)現(xiàn)后你能及時(shí)指出,以免誤導(dǎo)其他讀者,在此謝過(guò)。
warning 此版本有一些BUG,可作為參考,建議使用簡(jiǎn)化版
collectionview嵌套tableview實(shí)現(xiàn)懸停交互