下拉選單,說的永遠比做的容易
七月來臨
五樓高的辦公室
聽不到喞喞蟬聲
只有打字喀拉喀拉聲
上班無法接觸戶外大自然
是做工程師的壞處
也是好處
可以待在室內吹冷氣
呵呵
這個月的需求都比較普通
除了一個「下拉式選單」
這麼常見好用的原件
不知道為什麼iOS原生就是沒有提供
收到需求的當下
當然是先詢問估狗大神
有沒有三方寫好的套件
一搜果真有
快樂的用pod載下來
依照作者github上面的使用說明實作
跑出來的效果卻不甚理想
有些顏色的設定會跑掉
而且選單收合的時候還會卡頓
考慮到再找另外的套件
一樣要花時間
不如自己手刻一個
其實下拉式選單
就是一個View
加上一個可以隱藏的tableView
看似簡單
實作上卻遇到滿多問題的
原本我把tableView
直接用add subview的方式
掛在選單的下方
卻發現table的點擊事件沒有反應
後來才發現是因為table的view
超出原本選單view的範圍
才會造成這個問題
頭痛醫頭,腳痛醫腳
想當然爾就把原本的view的範圍加大
跨大到包含table
但還是失敗了
想了半天
才發現是同一個問題
因為整個下拉式選單的view
超過其父類別view的範圍
所以還是沒有用
第一個想到的解決方法
是找到畫面中最上層的View
直接把tableView掛在下面
保證不會超出範圍
但是沒想到在頁面切換時
table不會消失
還要自己呼叫removeFromSuperView
覺得這樣不太對勁
於是改成用外部給參數的方式
讓外部決定要把tableView加在哪一層View之下
才「解決」這個問題
當我感覺萬事OK
信心滿滿的點下選單table後
發現竟然還是沒有反應
真的差點崩潰
用關鍵字查didselectAtRow not called
才發現一個不太算bug的bug
也就是如果在tableView上層的view
使用addGesture方法的話
就會吃掉table的點擊事件
仔細看一下選單上一層的view
還真的有這個方法
好險解決方法很簡單
只要在手勢的物件上面
指定cancelsTouchesInView為false
就可以順利觸發下面table的點擊事件了
原本預估4小時的工作單
最後搞到超時3倍
真的是站著說話不腰疼
嫌別人的套件不好用
實際刻一個元件
就知道有多不容易
而這個月繼續在進行的加班專案
也就是購買模組
老實說有點不太順利
當初我的規劃中
如果遇到錯誤
會在內部做好錯誤處理
也就是用警告視窗
顯示錯誤訊息
會這樣做的理由
是因為我覺得可能大部分的人
都是這樣處理的
不過被主管打槍
原因有兩個
第一個就是如上面所說的
要讓外部決定如何處理錯誤
而不是在模組內部處理掉
第二個則是在資料的物件
做UI的顯示不太合理
有違物件導向的原則
所以規劃必須重來一次
首要之務就是編寫錯誤代碼的列舉
把各種錯誤狀況考慮進去
包括最基本的網路不穩
未開啟購買功能等等
到呼叫自家api失敗等等
並且把錯誤物件
用protocol的方式丟給外部
讓ViewController顯示錯誤訊息
避免上面所說的問題
整個模組有八成的程式碼
是在處理錯誤
到處都是guard … return
就像迷宮裡
錯誤的歧途千百條
而正確的出口只有一個
雖然80%的程式碼
可能只有20%的情況會跑到
但你還是得老老實實的寫
這就是程式阿~