其實搜素界面的輪子很多,但是之所以再寫,是因為發現市面上的很多框架,包括高分框架都是替我們制定了幾種類型的搜素頁面樣式, 但是如果我們產品提出了另一種樣式的要求,自定義頁面很不方面. 基于能夠更方面的自定義搜索頁面的目的, 寫下這個輪子.
LLSearchViewControllerBase說明
LLSearchViewControllerBase使用的是 MVP
模式.尾部有Presenter
或者P
的都是對應名稱的業務邏輯主持人,可以理解為業務處理者. 把業務邏輯代碼從ViewController
中抽取出來,分配到每個 view模塊對應的Presenter
中. 在實際項目中,MVVM 太過于細化, 需要很多的橋接方法, 我并不是很喜歡, MVC 模式又很容易讓新上手的人把c
寫的很臃腫, MVP
模式是一種很折中的模式.
實現功能
- (1)自定義搜索頁面View
- (2)歷史搜索
- (3)分類標簽
- (4)即時搜索結果匹配。
每個功能模塊極其展示 view都盡可能的獨立出來.
關于自定義搜索界面
ExtensionView
文件夾下邊類,是搜索頁面的[歷史搜索模塊,分類模塊,即時匹配結果模塊]的 view, ExtensionPresenter
中是歷史搜索頁面的業務處理者. 而[歷史搜索模塊,分類模塊]的業務處理者我則放到了SSearchVC
目錄下,這樣做其實并不是特別好, 我這么做是為了 demo 的展現, 在實際項目中, 其實你可以完全放到ExtensionPresenter
文件夾下.
- 我自定義了處理
歷史搜索記錄-LLNaviSearchHistorySaveBasePresenter
的基類和搜索控制器-LLNaviSearchBaseVC
頁面的基類,子類只需要繼承這兩個類就可以.分類模塊
和即時匹配
模塊沒有基類,也不需要, 你如果不想要這兩個功能,直接不實現其方法或者刪掉相關代碼即可.LLSearchNaviBarView
是一個帶有搜索框的模擬導航欄,你在任何地方都可以用它.
其中:
-
歷史搜索基類有保存,清理,獲取保存記錄方法. 子類繼承之后,需要在實現下面代碼(注意:指明存儲文件名字)
-
(instancetype)init{
if (self = [super init]) {
//code...
self.saveUtils = [[LLSearchHistorySaveUtils alloc] initWithSearchHistoriesCacheFileName:NearByShopSearchMapAddressHistoryCacheFileName];}
return self;
}
-
-
控制器 ViewController需要在繼承之后, 指定各模塊的業務處理者是誰
-(void)viewDidLoad { //告訴父類你的歷史搜索prestenter是什么 self.shopHistoryP = [HistoryAndCategorySearchHistroyViewP new]; //告訴父類你的分類prestenter是什么 self.shopCategoryP = [HistoryAndCategorySearchCategoryViewP new]; [super viewDidLoad]; }
其他
進一步說明
歷史搜索
和分類
模塊都是頁面動態或者提前加載的, 為了顯示動態還在的過程,我在HistoryAndCategorySearchVC
這個搜索控制器調用的時候, 特意模擬網絡數據延遲3s, 在實際操作中,為了保證體驗,建議提前加載保存到本地最好, 我這里并沒有針對分類提供本地持久化的方法.
即時結果匹配
這個功能, 只要實現下邊這三個方法,即默認開啟.
/**
即時搜索匹配框,匹配的數據列表
*/
@property (nonatomic,strong) NSArray<NSString *> *resultListArray;
/**
搜索框:用戶即時輸入完畢
@param didChangeBlock 更改后的回調
*/
- (void)searchbarDidChange:(searchBarDidChangeBlock)didChangeBlock;
/**
即時匹配結果列表cell點擊事件
*/
- (void)resultListViewDidSelectedIndex:(resultListViewCellDidClickBlock)cellDidClickBlock;
最后, 下面幾個控制器調用的地方,提供了部分搜索頁面接口展示:
?
內存泄露檢測
因為我沒有采用代理的方法,而是采用的bloc.開始第一版有些地方weakSelf并沒有寫全,導致了泄露問題,結合MLeaksFinder和Instruments進行了修復,但是使用MLeaksFinder 在 dealloc 方法已經執行了,還會報錯內存泄露, 而Instruments 的 call tree 沒有內容,有偶爾情況會全部報綠色對勾說沒有泄露,不知道什么原因. 如果有朋友有好的檢測內存泄露的方法,一定也告訴我下,我也學習下! 感謝提出內存泄露這個問題的朋友!
Demo地址
交流
希望能和大家交流技術
Blog:http://www.lilongcnc.cc