ZNTableView - 對(duì)UITableview的邏輯封裝

ZNTableViewKit的使用(GitHub地址:https://github.com/dreamfly-nan/ZNUIKit/tree/master/ZNUIKit/ZNUIKit/Public/ZNTableViewKit

基于UITableview有著共通性,也是因?yàn)閼泻瓦壿嫿怦顑?yōu)化胎署,我們理想的認(rèn)為數(shù)據(jù)管理數(shù)據(jù)兵怯,視圖管理視圖摆霉,事件管理管理,單一職能原則或渤,三者互不交叉,以此來降低代碼的邏輯復(fù)雜度,同時(shí)又使得代碼具備統(tǒng)一性棚菊,方便閱讀,有利于團(tuán)隊(duì)協(xié)作叔汁。在這個(gè)理念的基礎(chǔ)上统求,封裝了ZNTableView組件,通過ZNTableviewKit做了隔斷据块,解耦三者關(guān)系码邻。

ZNTableViewKit

ZNTableViewKit

下面來看下主要的幾個(gè)協(xié)議和對(duì)象的使用:

ZNTableViewHelper,UITableVIew的視圖管理對(duì)象

ZNTableViewHelper實(shí)現(xiàn)兩個(gè)協(xié)議另假,分別是ZNTableViewLunchProtocol(加載協(xié)議)像屋,ZNTableViewLayoutProtocol(布局協(xié)議)

ZNTableViewLunchProtocol加載協(xié)議

/// 加載過程

@protocol ZNTableViewLunchProtocol <NSObject>

@optional

/// 根據(jù)indexPath返回對(duì)應(yīng)的cell的class

/// 默認(rèn)取第一個(gè)注冊(cè)的cell

/// @param indexPath <#indexPath description#>

/// @param model <#model description#>

- (Class)cellClassWithIndexPath:(NSIndexPath *) indexPath

? ? ? ? ? ? ? ? ? ? ? ? ? model:(id) model;

/// 加載

/// @param cell <#cell description#>

/// @param indexPath <#indexPath description#>

- (void)lunchTableViewCell:(UITableViewCell *) cell

? ? ? ? ? ? ? ? indexPath:(NSIndexPath *) indexPath;

/// cell即將出現(xiàn)時(shí)調(diào)用

/// @param cell <#cell description#>

/// @param indexPath <#indexPath description#>

- (void)willDisplayWithTableViewCell:(UITableViewCell *) cell

? ? ? ? ? ? ? ? ? ? ? ? ? indexPath:(NSIndexPath *) indexPath;

@end

ZNTableViewLayoutProtocol布局協(xié)議

/// 布局

@protocol ZNTableViewLayoutProtocol <NSObject>

@optional

/// 每一項(xiàng)的高度,優(yōu)先使用這邊回掉的高度值浪谴,沒有實(shí)現(xiàn)則直接取注冊(cè)的高度值开睡,

/// 沒設(shè)置注冊(cè)的高度值,則直接使用默認(rèn)高度值

/// @param indexPath <#indexPath description#>

/// @param model <#model description#>

- (CGFloat)rowHeightWithIndexPath:(NSIndexPath *) indexPath

? ? ? ? ? ? ? ? ? ? ? ? tableView:(UITableView *) tableView

? ? ? ? ? ? ? ? ? ? ? ? ? ? model:(id) model;

/// 組頭的高度

/// @param section <#section description#>

- (CGFloat)headHeightWithSection:(NSInteger) section;

/// 組頭

/// @param section <#section description#>

- (UIView<ZNBaseViewProtocol> * __nullable)headViewWithSection:(NSInteger) section;

/// 組尾的高度

/// @param section <#section description#>

- (CGFloat)footerHeightWithSection:(NSInteger) section;

/// 組尾

/// @param section <#section description#>

- (UIView<ZNBaseViewProtocol> * __nullable)footerViewWithSection:(NSInteger) section;

@end

ZNTableViewDataLoader,UITableView的數(shù)據(jù)源管理對(duì)象

ZNTableViewDataLoader實(shí)現(xiàn)協(xié)議ZNTableViewDataSourceProtocol(數(shù)據(jù)管理)苟耻,基本形態(tài)的數(shù)據(jù)管理已經(jīng)在ZNTableViewDataLoader內(nèi)部進(jìn)行實(shí)現(xiàn)篇恒,使用者如果有特殊的需求,可繼承該對(duì)象進(jìn)行重寫或者添加新方法凶杖。而對(duì)象中的loadFinishBlock代碼塊是根據(jù)數(shù)據(jù)源中數(shù)據(jù)處理結(jié)束后進(jìn)行調(diào)用胁艰,而組件對(duì)其調(diào)用的傳參進(jìn)行解析并展示對(duì)應(yīng)的視圖樣式,例如空視圖智蝠,或者錯(cuò)誤視圖之類的腾么。

這邊有一個(gè)注意點(diǎn):'- (void)loadData:(BOOL) isReSetData;'只有該方法會(huì)觸發(fā)加載視圖,而加載視圖的消失杈湾,是在調(diào)用loadFinishBlock后消失的,具體的使用還需要自己去實(shí)驗(yàn)下看看解虱。

- (void)loadData:(BOOL) isReSetData;

ZNTableViewDataSourceProtocol數(shù)據(jù)管理協(xié)議

@protocol ZNTableViewDataSourceProtocol <NSObject>

/// 加載完成后回調(diào)

@property(nonatomic, copy,nullable) ZNLoadFinishBlock loadFinishBlock;

/// 重設(shè)數(shù)據(jù)源

/// @param array <#array description#>

- (void)setDataSourceWithArray:(id) array;

/// 獲取數(shù)據(jù)源

- (id)obtainDataSource;

/// 是否有數(shù)據(jù),未實(shí)現(xiàn)則默認(rèn)無數(shù)據(jù)

- (BOOL)haveData;

/// 是否是下拉刷新數(shù)據(jù)

/// @param isReSetData <#isReSetData description#>

- (void)loadData:(BOOL)isReSetData;

/// 組數(shù) - 未實(shí)現(xiàn)則默認(rèn)返回0

- (NSInteger)numberOfSection;

/// 每組的row數(shù)量

/// @param section <#section description#>

- (NSInteger)numbserOfRowWithSecion:(NSInteger)section;

/// 根據(jù)indexPath獲取對(duì)應(yīng)的數(shù)據(jù)模型

/// @param indexPath <#indexPath description#>

- (NSObject *)obtianObjectWithIndexPath:(NSIndexPath *)indexPath;

/// 獲取該組的數(shù)據(jù)數(shù)組

/// @param section <#section description#>

- (NSArray *)obtainArrayWithSecion:(NSInteger)section;

@optional

/// 是否是頭部

/// @param indexPath <#indexPath description#>

- (BOOL)isHeaderWithIndexPath:(NSIndexPath *) indexPath;

/// 是否是尾部

/// @param indexPath <#indexPath description#>

- (BOOL)isFooterWithIndexPath:(NSIndexPath *) indexPath;

@end

ZNTableViewKit,UITableView的管理對(duì)象

使用ZNTableViewKit進(jìn)行注冊(cè)對(duì)應(yīng)的Cell視圖漆撞,空視圖殴泰,錯(cuò)誤視圖,以及加載視圖浮驳,頭部悍汛,尾部刷新等;同時(shí)可注冊(cè)數(shù)據(jù)策略至会,操作事件离咐;以及加載調(diào)用。

@interface ZNTableViewKit : NSObject <ZNTableViewKitProtocol>

@property(nonatomic , weak) id<ZNTableViewKitDelegate> ZNDelegate;

/// 只傳入數(shù)據(jù)源與tableView

/// @param tableView <#tableView description#>

/// @param dataSource <#dataSource description#>

- (instancetype)initWithSingleGroupTableView:(UITableView *) tableView

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dataSource:(NSArray *) dataSource;

/// 只傳入數(shù)據(jù)源與tableView

/// @param tableView <#tableView description#>

/// @param dataSource <#dataSource description#>

- (instancetype)initWithMoreGroupTableView:(UITableView *) tableView

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dataSource:(NSArray *) dataSource;

/// 不用傳manager對(duì)象的實(shí)例化方法

/// @param viewHelper <#viewHelper description#>

/// @param dataLoader <#dataLoader description#>

/// @param tableView <#tableView description#>

- (instancetype)initWithViewHelper:(id<ZNTableViewLayoutProtocol,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ZNTableViewLunchProtocol> ) viewHelper

? ? ? ? ? ? ? ? ? ? ? ? dataLoader:(id<ZNTableViewDataSourceProtocol>) dataLoader

? ? ? ? ? ? ? ? ? ? ? ? tableView:(UITableView *) tableView;

/// 當(dāng)前tableview的處理對(duì)象

/// @param tableView 主tableview

/// @param manager 管理對(duì)象

- (instancetype)initWithTableView:(UITableView *) tableView

? ? ? ? ? ? ? ? ? ? ? ? ? manager:(ZNTableViewManage *) manager;

/// 注冊(cè)對(duì)應(yīng)的cell

/// @param model <#model description#>

- (void)addRegisterModel:(ZNRegisterModel *) model;

/// 注冊(cè)對(duì)應(yīng)的cell

/// @param models <#models description#>

- (void)addRegisterModels:(NSArray<ZNRegisterModel *> *) models;

/// 添加策略

/// @param strategyClass <#strategyClass description#>

- (void)addRegisterStrategyWithClass:(id<ZNTableViewStrategyProtocol>) strategyClass;

/// 添加事件

/// @param action <#action description#>

- (void)addAction:(id<ZNTableViewActionProtocol>) action;

/// 空視圖接入

/// @param emptyView <#emptyView description#>=

- (void)setEmptyView:(UIView*) emptyView;

/// 錯(cuò)誤視圖接入

/// @param errorView <#errorView description#>

- (void)setErrorView:(UIView *) errorView;

/// 加載圖接入

/// @param loadView <#loadView description#>

- (void)setLoadView:(UIView *) loadView;

/// 注冊(cè)頭部

/// @param header <#header description#>

- (void)registerRefreshHead:(MJRefreshHeader *) header;

/// 注冊(cè)尾部

/// @param footer <#footer description#>

- (void)registerRefreshFoot:(MJRefreshFooter *) footer;

- (void)loadData:(BOOL) isReSetData;

@end

NRegisterModel注冊(cè)cell模型對(duì)象

該對(duì)象主要包含Cell的類型奉件,高度宵蛀,已經(jīng)對(duì)應(yīng)的數(shù)據(jù)類型名稱昆著,ZNTableViewKit會(huì)根據(jù)用戶注冊(cè)的模型進(jìn)行自動(dòng)匹配對(duì)應(yīng)的cell,高度糖埋,以及給cell設(shè)置對(duì)應(yīng)的數(shù)據(jù)模型宣吱。

@interface ZNRegisterModel : NSObject

@property(nonatomic , strong, readonly) Class cellClass;

///模型名稱

@property(nonatomic , strong, readonly) NSString * modelName;

@property(nonatomic , assign) CGFloat height;

@property(nonatomic , assign ,readonly) BOOL cutsHeight;

/// 注冊(cè)cell

/// @param cellClass <#cellClass description#>

+ (instancetype)initWithCellClass:(Class) cellClass;

/// 注冊(cè)cell

/// @param cellClass <#cellClass description#>

/// @param height <#height description#>

+ (instancetype)initWithCellClass:(Class) cellClass

? ? ? ? ? ? ? ? ? ? ? ? ? height:(CGFloat) height;

/// 注冊(cè)cell,并且注冊(cè)cell對(duì)應(yīng)的model對(duì)象

/// @param cellClass <#cellClass description#>

/// @param modelName <#modelName description#>

+ (instancetype)initWithCellClass:(Class)cellClass

? ? ? ? ? ? ? ? ? ? ? ? modelName:(NSString*) modelName;

/// 注冊(cè)cell瞳别,并且注冊(cè)cell對(duì)應(yīng)的model對(duì)象

/// @param cellClass <#cellClass description#>

/// @param modelName <#modelName description#>

/// @param height <#height description#>

+ (instancetype)initWithCellClass:(Class)cellClass

? ? ? ? ? ? ? ? ? ? ? ? modelName:(NSString*) modelName

? ? ? ? ? ? ? ? ? ? ? ? ? height:(CGFloat) height;

+ (NSArray *)initWithArrayCellClass:(NSArray<Class> *) arrayClass;

@end

注意

如果存在一種數(shù)據(jù)模型對(duì)應(yīng)多種cell征候,則需要自行重寫ZNTableViewHelper對(duì)象以下方法

/// 根據(jù)indexPath返回對(duì)應(yīng)的cell的class

/// 默認(rèn)取第一個(gè)注冊(cè)的cell

/// @param indexPath <#indexPath description#>

/// @param model <#model description#>

- (Class)cellClassWithIndexPath:(NSIndexPath *) indexPath

? ? ? ? ? ? ? ? ? ? ? ? ? model:(id) model;

Cell對(duì)象需實(shí)現(xiàn)ZNBaseTableViewCellProtocol協(xié)議

組頭組尾如有重寫需實(shí)現(xiàn)ZNBaseViewProtocol協(xié)議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祟敛,隨后出現(xiàn)的幾起案子疤坝,更是在濱河造成了極大的恐慌,老刑警劉巖馆铁,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跑揉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡埠巨,警方通過查閱死者的電腦和手機(jī)历谍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辣垒,“玉大人望侈,你說我怎么就攤上這事⊙埃” “怎么了脱衙?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)例驹。 經(jīng)常有香客問我捐韩,道長(zhǎng),這世上最難降的妖魔是什么鹃锈? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任荤胁,我火速辦了婚禮,結(jié)果婚禮上屎债,老公的妹妹穿的比我還像新娘寨蹋。我一直安慰自己宫莱,他們只是感情好吼具,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布傅联。 她就那樣靜靜地躺著,像睡著了一般召娜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惊楼,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天玖瘸,我揣著相機(jī)與錄音秸讹,去河邊找鬼。 笑死雅倒,一個(gè)胖子當(dāng)著我的面吹牛璃诀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔑匣,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼劣欢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了裁良?” 一聲冷哼從身側(cè)響起凿将,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎价脾,沒想到半個(gè)月后牧抵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侨把,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年犀变,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秋柄。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡获枝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出华匾,到底是詐尸還是另有隱情映琳,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布蜘拉,位于F島的核電站萨西,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旭旭。R本人自食惡果不足惜谎脯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望持寄。 院中可真熱鬧源梭,春花似錦、人聲如沸稍味。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)模庐。三九已至烛愧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怜姿。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工慎冤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沧卢。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓蚁堤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親但狭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子披诗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容