你的商城缺篩選側(cè)邊欄嗎?

ZYSideSlipFilter是一個(gè)側(cè)邊欄條件篩選器,高度自定義各種篩選區(qū)域,AutoLayout動(dòng)態(tài)適配cell高度,功能當(dāng)然就是那個(gè),選擇條件,保存選擇狀態(tài),重置條件。即插即拔,基本支持自定義任何內(nèi)臟,樣式是怎樣完全由你制定,Demo我做成了商城風(fēng)格,怎樣用全在于你自己。ZYSideSlipFilter的工作核心是數(shù)據(jù)源,它貫穿了整個(gè)工作流程。


我們來看結(jié)構(gòu)圖:


以上截圖來自Demo,我們看見的數(shù)據(jù)、篩選區(qū)域、UI結(jié)構(gòu)全部都不是ZYSideSlipFilter決定的,all self-definition自定義。我們通過數(shù)據(jù)源(dataList)來跟Filter交流交換數(shù)據(jù),包括我們的篩選條目的cell結(jié)構(gòu),我們的篩選條件,默認(rèn)選擇,和用戶選擇的結(jié)果。也就是說這是一個(gè)變化的數(shù)據(jù)源,像是一張調(diào)查問卷,進(jìn)去是干凈的,而出來是涂畫過的。我們?cè)鯓油ㄟ^Filter這個(gè)中間者去給用戶填問卷呢?來看看數(shù)據(jù)源的結(jié)構(gòu)圖:


ZYSideSlipFilterRegionModel和containerCellClass

圖看起來有點(diǎn)復(fù)雜,沒關(guān)系我們只需要認(rèn)識(shí)最左邊的ZYSideSlipFilterRegionModel,一個(gè)RegionModel代表一個(gè)篩選區(qū)域,也就是說我們需要在Filter里增加一個(gè)篩選區(qū)域,就創(chuàng)建一個(gè)RegionModel,F(xiàn)ilter數(shù)據(jù)源里放的就是這個(gè)東西。而在RegionModel里面,最基本的我們只需要認(rèn)識(shí)containerCellClass這個(gè)property, 它代表這個(gè)這個(gè)篩選區(qū)域的UI布局和邏輯代碼所在的類(TableviewCell), 我們要求該自定義類繼承自SideSlipBaseTableViewCell, 自定義篩選區(qū)域tableViewCell,創(chuàng)建RegionModel,賦值containerCellClass,放進(jìn)dataList,我們自己的Filter就能顯示出來了

配置篩選項(xiàng)

上圖中我們可以看見Demo的3塊篩選區(qū)域截圖,下箭頭對(duì)應(yīng)了他們的RegionModel內(nèi)容,最基本的containerCellClass配置好后,我們可以用regionTitle存儲(chǔ)區(qū)域標(biāo)題,用itemList來存儲(chǔ)自定義的選項(xiàng)Model,isShowAll標(biāo)識(shí)著是否展開全部選項(xiàng),selectedItemList存儲(chǔ)著用戶選中的選項(xiàng)Model,這里再提一遍,用戶發(fā)生交互后,我們是要修改RegionModel的,用戶提交篩選時(shí)我們會(huì)拿到這些修改。對(duì)于以上這些property我們不用,或者不滿足需求都沒關(guān)系,customDict給你放任何附加內(nèi)容。

SideSlipFilter數(shù)據(jù)交流的方法

上面了解完如何去創(chuàng)建自己的Filter后,以下就是主要協(xié)同工作的api:


自定義篩選區(qū)域cell

繼承自SideSlipBaseTableViewCell

+ (NSString *)cellReuseIdentifier;

返回cell的重用標(biāo)識(shí)

+ (CGFloat)cellHeight;

返回cell固定高度(cell高度的其中一種方式,下面有詳細(xì)講解)

+ (instancetype)createCellWithIndexPath:(NSIndexPath *)indexPath;

返回cell實(shí)例對(duì)象

- (void)updateCellWithModel:(ZYSideSlipFilterRegionModel **)model indexPath:(NSIndexPath *)indexPath;

cell的更新方法,傳入model對(duì)象地址指針,供cell獲取用戶交互后修改

- (void)resetData;

用戶重置選項(xiàng)時(shí)會(huì)調(diào)用這個(gè)方法

SideSlipBaseTableViewCell代理

delegate

ZYSideSlipFilterController對(duì)象

- sideSlipTableViewCellNeedsReload

該cell需要刷新

- sideSlipTableViewCellNeedsPushViewController:animated:

該cell觸發(fā)條件后需要push頁(yè)面

- sideSlipTableViewCellNeedsScrollToCell:atScrollPosition:animated:

該cell觸發(fā)條件后需要滾動(dòng)到tableView的中央位置

通知

FILTER_NOTIFICATION_NAME_DID_RESET_DATA

FILTER_NOTIFICATION_NAME_DID_COMMIT_DATA

配置文件ZYSideSlipFilterConfig

FILTER_NAVIGATION_CONTROLLER_CLASS

Filter的導(dǎo)航控制器Class(構(gòu)造方法只支持- initWithRootViewController:)

各種UI參數(shù)

語言本地化Localizable.strings

目前配置了兩個(gè)bottomButton的title string,有需要可以在自己項(xiàng)目的.strings文件中配置,不配置則默認(rèn)為Reset, Commit

"sZYFilterReset"="Reset";

"sZYFilterCommit"="Commit";

自適應(yīng)cell高度

ZYSideSlipFilter會(huì)在每次reloadData時(shí)動(dòng)態(tài)適配cell高度,前提是cell內(nèi)subviews橫向縱向都部署好了對(duì)tableViewContentView的自動(dòng)約束,必須是對(duì)ContentView!!,對(duì)tableView無效!!

如果需要設(shè)置固定高度,則可以重寫父類SideSlipBaseTableViewCell的+ cellHeight方法即可。

Usage:

ZYSideSlipFilterController

創(chuàng)建ZYSideSlipFilterController實(shí)例,讓呼出者controller持有它,這樣我們能夠保持著Filter的狀態(tài)并且能夠多次呼出(我們要求呼出者必須有navigationController)

self.filterController = [[ZYSideSlipFilterController alloc] initWithSponsor:self

resetBlock:^(NSArray?*dataList)?{

//Reset?Data

} ?commitBlock:^(NSArray?*dataList)?{

//Commit?Data

}];

_filterController.animationDuration?=?.3f;

_filterController.sideSlipLeading?=?0.15*[UIScreen?mainScreen].bounds.size.width;

_filterController.dataList?=?[self?packageDataList];

[_filterController.navigationController setNavigationBarHidden:NO];

[_filterController?setTitle:@"title"];

就是這樣,我們的filter可以投向使用了嗎?并不是,最重要的是我們的數(shù)據(jù)源dataList。數(shù)據(jù)源的結(jié)構(gòu)見數(shù)據(jù)源結(jié)構(gòu)圖,ZYSideSlipFilter會(huì)按照數(shù)據(jù)源結(jié)構(gòu)規(guī)則去工作起來。

數(shù)據(jù)源準(zhǔn)備好后, 讓Filter顯示出來

[_filterController show];

自定義篩選RegionCell

@interface Custom***TableViewCell : SideSlipBaseTableViewCell

+ (NSString *)cellReuseIdentifier {

//cellReuseIdentifier

}

+?(CGFloat)cellHeight?{

//option

//you?can?use?autolayout?to?cellContentView?Rather?than?this?func

}

+?(instancetype)createCellWithIndexPath:(NSIndexPath?*)indexPath?{

//cell?instance?object

}

-?(void)updateCellWithModel:(ZYSideSlipFilterRegionModel?**)model

indexPath:(NSIndexPath?*)indexPath?{

//update?your?cell

}

-?(void)resetData?{

//option

//respond?while?user?click?resetButton

}


Demo自定義Region示意圖


詳細(xì)使用方法請(qǐng)參照Demo?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,228評(píng)論 4 61
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,490評(píng)論 1 23
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,610評(píng)論 30 472
  • 孩子畢竟是孩子,他們的自律能力并不是那么強(qiáng),他們需要父母的陪伴。孩子成長(zhǎng)的路上并不是一帆風(fēng)順的,一定會(huì)磕磕絆絆,這...
    大杜915閱讀 355評(píng)論 0 1

友情鏈接更多精彩內(nèi)容