在最近的開發(fā)工作中, view上寫了一個(gè)button, 但是點(diǎn)擊總是沒有響應(yīng)事件很是苦惱, 雖然最后的解決方案非常簡單, 看起來自己就和傻子一樣, 但是再?zèng)]有找到問題之前, 這個(gè)就是一個(gè)難題, 所以將這一次的尋找bug的過程給記錄下來, 給以后的自己看看, 找bug從最簡單的地方找起, 不要想著這里不可能有問題之類的, 有這種想法的話, 那么bug很有可能就在你瞧不起的最簡單的地方.
1. 檢查userInterfaractionEnabled
檢查父視圖的userInterfaractionEnabled是否打開, 眾所周userInterfaractionEnabled 是開啟控件交互事件的屬性, 如果這個(gè)屬性沒有開啟, 那么再怎么調(diào)試 也是廢了. 那么第一步就要檢查這個(gè).
2. 檢查視圖層級(jí)
檢查控件的位置是不是在父視圖上,如果沒有就當(dāng)然不能點(diǎn)擊了, 這里就有一種情況, 如果子視圖的高度超過父視圖, 而子視圖上最靠邊的控件就是button, 那么點(diǎn)擊這個(gè)button的時(shí)候就不會(huì)觸發(fā)事件, 這個(gè)情況很難從邏輯檢查出來bug所在, 只能從UI查看得到.
[圖片上傳失敗...(image-7ba5-1637482497417)]
3. 檢查控件是否被覆蓋
如果button上層有一層透明的視圖覆蓋掉的話, 也是無法響應(yīng)的. 這個(gè)從邏輯和UI上都可以檢查得到, 還是比較容易的
4. frame
檢查button 的 frame, 如果實(shí)際的frame和展示出來的UI 不一直的話, 那么超出來的部分也是沒有響應(yīng)事件的.
5. touchBegin
可以在父視圖上加上一個(gè)touchBegin方法,檢查一下。是不是父視圖的交互事件給關(guān)閉掉了.
6. 響應(yīng)鏈
可以通過查看響應(yīng)者鏈, 事件傳遞到哪一層, 在哪一層被響應(yīng)了, 是什么導(dǎo)致沒有傳遞到下一層的. NSLog(@"%@",button.responder);
NSLog(@"%@",button.responder.responder);等等
7. 其他
比如沒有添加點(diǎn)擊事件, 等等...
ps:其實(shí)這個(gè)問題出來的時(shí)候第一時(shí)間想到的就是響應(yīng)者鏈條和事件傳遞相關(guān)點(diǎn),事實(shí)證明光想到可能出現(xiàn)的點(diǎn)到解決問題可能差了一個(gè)小時(shí)。。。