團隊型項目開發中,每每是根據功能模塊進行開發任務分工的,如:商品模塊、社交模塊、設置模塊等等,可是模塊與模塊之間,每每存在着一些橫向的、通用的小功能,如:日曆選擇、出發地選擇以及本文要談到的搜索控制器。
作橫向模塊和封裝框架是同樣同樣的,最最重要的,是接口的設計。如何加強模塊的通用性、減小侵入性,讓該模塊的使用者用的爽,在設計接口的時候須要充分考慮的。git
所謂通用性,是指能在多大程度上讓別人用。作的最好的應該是蘋果的UITableView。UITableView被稱爲「SB控件」,由於他不用知道本身展現什麼內容,不用知道本身須要展現多少行,一切差別化的東西,所有經過代理來獲取,因此他能擁有極其強大的通用性,全部想要作表格型展現的人都能用。github
所謂侵入性,是指別人用了你的控件,一旦不想繼續用了,要花費的調整代碼的精力會不會很是大。推薦傑哥的MJExtension,這個神同樣的框架基本上作到了零侵入性。數組
OK,裝B完畢,我們來看看這個「搜索控制器」的需求。緩存
數據層面,請求數據的邏輯在搜索控制器內部寫死?仍是讓外部把搜索結果傳進來?網絡
其餘框架
如今,我們想作這樣一個搜索控制器:ide
有足夠的通用性,請求數據、數據存儲等事情交給調用者處理,咱們的搜索控制器只負責數據展現
1.1 這意味着,咱們須要告訴調用者(數據逆傳):spa
1.2 調用者須要告訴咱們(數據順傳):設計
請注意,一般咱們進行數據順傳的方式,是拿到某個控制器,點出來他的屬性,並進行賦值;而我們想要的效果,是最大程度限制調用者的權限,不讓調用者拿到我們的搜索控制器(意味着不能點出來)的同時,最好限制調用者只能經過我們給定的方法告訴我們搜索結果(不讓調用者拿到搜索控制器的屬性)。3d
怎麼辦?有什麼辦法能不返還給調用者一個對象,只返還給調用者一個方法?答案是block。
數據逆傳方面,我的也仍是很是喜歡block。由於相比於代理,block可以讓代碼實現「高聚合、低耦合」,不用跳來跳去的找代碼,維護起來更方便。
(下一篇:一個複雜的首頁的獨白中,我們會用到將代理和數據源方法,全都變成block的tableView)
這篇文章主要講的,其實仍是接口設計。因此代碼就只貼頭文件吧,源碼丟在Github上了嗯(源碼傳送門)...若是以爲還有那麼點小啓發的話,記得順手點星哦^_^
1 文/Azen(簡書做者) 2 原文連接:http://www.jianshu.com/p/6d5327111511 3 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。 4 5 // 6 // AZXSearchController.h 7 // AZXSearchControllerDemo 8 // 9 // Created by Azen.Xu on 15/12/5. 10 // Copyright © 2015年 Azen.Xu. All rights reserved. 11 // 12 13 #import <UIKit/UIKit.h> 14 15 typedef NS_ENUM(NSInteger, AZXSearchControllerType) // 搜索控制器類型 16 { 17 AZXSearchControllerTypePartOne = 1 << 0, // 板塊一 18 AZXSearchControllerTypePartTwo = 1 << 1, // 板塊二 19 AZXSearchControllerTypePartThree = 1 << 2 // 板塊三 20 }; 21 22 typedef NS_ENUM(NSInteger, AZXSearchFunctionType) // 點擊事件類型 23 { 24 AZXSearchFunctionTypeClear = 1 << 0, // 點擊了"清除搜索歷史"按鈕 25 AZXSearchFunctionTypeSearch = 1 << 1, // 點擊了"搜索"按鈕 26 AZXSearchFunctionTypeSearchArray = 1 << 2, // 點選了搜索結果列表 27 AZXSearchFunctionTypeHotArray = 1 << 3, // 點選了熱門搜索列表 28 AZXSearchFunctionTypeHistoryArray = 1 << 4, // 點選了歷史搜索列表 29 AZXSearchFunctionTypeCreatTagForDiscover = 1 << 5 // 點選了建立標籤 30 }; 31 32 typedef void(^AZXSearchCallBack)(AZXSearchFunctionType selectedType , NSInteger selectedRowIndex , NSString *resultString); // 點擊回調 參數一:點擊事件類型 參數二:選中行號 參數三:選中文字 33 typedef void(^AZXSearchSetNewArrayHandle)(NSArray *newArray); // 經過此block傳遞搜索結果字符串數組 34 35 36 @interface AZXSearchController : UIViewController 37 38 /** 39 * 根據type建立不一樣展現樣式的搜索控制器,返回搜索結果handleArray 40 * 41 * @param fromController 來源控制器 42 * @param hotArray 熱門搜索stringArray 43 * @param hisArray 歷史搜索stringArray 44 * @param type 樣式枚舉 45 * @param calBack 回調 - 數據請求成功後請爲handleStringArray從新賦值 46 * 47 * @return 搜索結果handelArray 48 */ 49 + (AZXSearchSetNewArrayHandle)showSearchControllerFromController :(UIViewController *)fromController 50 withHotModelArray :(NSArray *)hotArray 51 hisModelArray :(NSArray *)hisArray 52 type :(AZXSearchControllerType)type 53 callBack :(AZXSearchCallBack)callBack; 54 55 @end