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