前段時間有小伙伴問到我:"這樣的控件該怎么做呢?",我感覺是個比較簡單的控件,可能對於入行不久的同志思路沒有很清晰吧。趁着最近工作不忙,就來這里分享一下我封裝自定義控件的幾點體會吧。
一個良好的自定義控件,能大大減少控制器里的代碼,讓代碼在它最應該在的地方,顯得層次清晰。此外,一個沒有耦合的自定義控件,能拿到之后的任何項目中用,提高開發效率。接口友好、使用簡單、不存在耦合、代碼層次清晰易維護等是一個好控件的必備素質。項目中常見的自定義控件,往往是一些彈窗,方便用戶進行查看、輸入、選擇等操作。
下面貼出我最近封裝的三個控件代碼、效果圖和思路分析。
一、時間選擇器
1. 使用方法:先調用show方法,再定義回調block。
2. 效果截圖:控件內部加入了時間過濾(截圖時間12-09 09:55)並記憶了上次的選擇,無耦合。
3. 思路分析:這個便是小伙伴問到我的控件,這個控件當時是用於這樣的場景:用戶約時間咨詢專家,通過這個控件選擇一個時間點。我的思路如下:
1) 分析界面(view):
這個界面上部分是一個工具條,左右兩個按鈕分別切換到上一天/下一天,中間的lable顯示日期和星期幾。再看中間的12個按鈕,每個按鈕都代表某一個時間點,有可點擊狀態/不可點擊狀態/選中狀態三種樣式,在Demo中我用的是按鈕來實現,用collectionView應該能讓代碼更簡潔。
同時需要考慮到,用戶每切換到另一天,控件需要刷新一下,要根據新的一天里,專家空閑時間(服務器返回),來刷新中間12個按鈕的顯示樣式[可預約/不可預約/當前選擇]。
2) 分析數據(model):
先分析當前展示的一天中需要的數據,我們需要告訴用戶該專家哪些時間點可預約,哪些不可預約,用一個字段來表示就可以了,這里一共是12個時間點,也就是說這個控件的每一次展示,需要一個有12個元素的數組,這12個元素分別對應這12個時間點是否可預約。
假設我們允許用戶的預約范圍是未來一周,那么這個控件就需要一個包含7個子數組的大數組,每個子數組有12個元素,是專家某一天的可否預約的數據。好,所以控制器需要給這個控件一個大數組。
3) 上一天/下一天按鈕的點擊事件處理:
更多分析詳見Demo。
二、自定義多行輸入框
1. 使用方法:先設置數據,再調用show方法,最后定義回調block。
2. 效果截圖:控件內部加入了手機號、郵箱檢測方法,無耦合; 非法提示方式也較合適。
3. 思路分析:這個控件很簡單,用起來也很方便,控件內部會根據傳進來的數據決定展示幾行輸入框出來,內部有做了數據的合法性檢查、鍵盤處理等...思路倒沒什么好說的...
三、日期選擇器
1. 使用方法:先調用show方法,再定義回調block。
2. 效果截圖:控件內部加入了簡單的時間判斷和非法選擇時的提示,只有當時間合法時,才調用回調block,傳遞合法的時間string出去。
3. 思路分析:好吧,這個控件更簡單了...
四、小結
當我拿到設計圖時,第一步先分析界面什么地方應該是什么控件,再分析需要控制器傳過來什么數據,然后把需要暴露的屬性放在h文件里,不需要暴露的屬性放在m文件里。我封裝的自定義控件,一直努力做到以下兩點:
1. 接口友好,使用盡量簡單。顯示就是show,隱藏就是hide,不需要控制器來完成顯示和隱藏的代碼,控制器只需要告訴我什么時候show,什么時候hide就行。
2. 該封裝的封裝好,減少控制器里的代碼。控制器只需要關心給你什么數據、什么時候讓你show、什么時候讓你hide和你的點擊事件我應該怎么處理。而不去關心你怎么展示數據、怎么處理數據等。
Demo的github地址:https://github.com/banchichen/SomeGoodCustomView
歡迎大家也把自己常用好用的自定義控件分享上去...也歡迎大家對其中瑕疵之處進行批評指正...