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
下面來看下主要的幾個(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é)議