我们知道IOS是没有类似RadioButton的单选框,So 我们来看下github 上start最多的项目RadioButton-ios的实现方式。
地址:GitHub – onegray/RadioButton-ios: Lightweight RadioButton class for iOS
先看效果图:
![](http://file.zhishichong.com/images/article/20161028/5b51b7451549a6e70f09c6c52bc987ea.png)
接下来我们分析下源码:
这个项目只有两个文件:RadioButton.h和RadioButton.m,先看下RadioButton.h的内容:
![](http://file.zhishichong.com/images/article/20161028/77874b315bde34f803b40c70caac5aa9.jpg)
其实也没什么,但是有个属性就比较的特殊:groupButtons,他用了IBOutletCollection的实现方式。这个关键字,可以将界面上一组相同的控件连接到同一个数组中。通常情况下,我们使用一个IBOutletCollection属性时,属性必须是strong的,且类型是NSArray。具体想了解更多IBOutletCollection,可以参考:IBOutletCollection的使用方法 – CocoaChina_让移动开发更简单。这里用IBOutletCollection主要还是为了方便能够在IB中方便操作,其实用NSArray实现也是一样的。
![](http://file.zhishichong.com/images/article/20161028/0064cTs2gw1f2kx24mwrug306o05k3yr.gif)
RadioButton.m中最主要的方法
![](http://file.zhishichong.com/images/article/20161028/b65b723f5c1a84b806c4e92fe9f6c9c2.png)
如果用IB方式进行组合的话,这个方法不需要你去主动调用。其实这个方法做的工作就是遍历buttons,然后通过NSValue的valueWithNonretainedObject方法将buttons设置到sharedLinks数组里面。为什么取sharedLink这个名字,主要是因为这些buttons引用的是同一个sharedLinks。之后其他的方法就是围绕着sharedLinks去操作,并通过NSValue的nonretainedObjectValue获取之前封装的值。注意:这里为什么要多此一举的用NSValue的两个方法,其实这里存在一个循环引用的问题,而NSValue的两个方法就是为了弱化这层关系,大家可以好好琢磨。
![](http://file.zhishichong.com/images/article/20161028/84f04999b65ed63bc910e1615a58d61f.png)
选中之后的操作会执行这几个方法,主要是设置当前RadioButton选中状态,然后循环便利其他RadioButton状态为未选中状态。如果是用IB进行操作的话,选中和未选中的状态的背景可以通过如下图方法设置:
![](http://file.zhishichong.com/images/article/20161028/7193fbeeb99c0009660397f52d3033e4.png)
如果理解有错误的地方,欢迎大家可以指出来,一起探讨。