我們知道IOS是沒有類似RadioButton的單選框,So 我們來看下github 上start最多的專案RadioButton-ios的實現方式。
地址:GitHub – onegray/RadioButton-ios: Lightweight RadioButton class for iOS
先看效果圖:
接下來我們分析下原始碼:
這個專案只有兩個檔案:RadioButton.h和RadioButton.m,先看下RadioButton.h的內容:
其實也沒什麼,但是有個屬性就比較的特殊:groupButtons,他用了IBOutletCollection的實現方式。這個關鍵字,可以將介面上一組相同的控制元件連線到同一個陣列中。通常情況下,我們使用一個IBOutletCollection屬性時,屬性必須是strong的,且型別是NSArray。具體想了解更多IBOutletCollection,可以參考:IBOutletCollection的使用方法 – CocoaChina_讓移動開發更簡單。這裡用IBOutletCollection主要還是為了方便能夠在IB中方便操作,其實用NSArray實現也是一樣的。
RadioButton.m中最主要的方法
如果用IB方式進行組合的話,這個方法不需要你去主動呼叫。其實這個方法做的工作就是遍歷buttons,然後通過NSValue的valueWithNonretainedObject方法將buttons設定到sharedLinks陣列裡面。為什麼取sharedLink這個名字,主要是因為這些buttons引用的是同一個sharedLinks。之後其他的方法就是圍繞著sharedLinks去操作,並通過NSValue的nonretainedObjectValue獲取之前封裝的值。注意:這裡為什麼要多此一舉的用NSValue的兩個方法,其實這裡存在一個迴圈引用的問題,而NSValue的兩個方法就是為了弱化這層關係,大家可以好好琢磨。
選中之後的操作會執行這幾個方法,主要是設定當前RadioButton選中狀態,然後迴圈便利其他RadioButton狀態為未選中狀態。如果是用IB進行操作的話,選中和未選中的狀態的背景可以通過如下圖方法設定:
如果理解有錯誤的地方,歡迎大家可以指出來,一起探討。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式