七月來臨

五樓高的辦公室

聽不到喞喞蟬聲

只有打字喀拉喀拉聲

上班無法接觸戶外大自然

是做工程師的壞處

也是好處

可以待在室內吹冷氣

呵呵

這個月的需求都比較普通

除了一個「下拉式選單」

這麼常見好用的原件

不知道為什麼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%的情況會跑到

但你還是得老老實實的寫

這就是程式阿~