iOS 单选框RadioButton实现

来源:互联网 发布:it职业高中 编辑:程序博客网 时间:2024/05/20 12:21

我们知道iOS是没有类似RadioButton的单选框,So 我们来看下github 上start最多的项目RadioButton-ios的实现方式。

地址:GitHub - onegray/RadioButton-ios: Lightweight RadioButton class for iOS

先看效果图:


接下来我们分析下源码:

这个项目只有两个文件:RadioButton.h和RadioButton.m,先看下RadioButton.h的内容:


RadioButton.h

其实也没什么,但是有个属性就比较的特殊:groupButtons,他用了IBOutletCollection的实现方式。这个关键字,可以将界面上一组相同的控件连接到同一个数组中通常情况下,我们使用一个IBOutletCollection属性时,属性必须是strong的,且类型是NSArray。具体想了解更多IBOutletCollection,可以参考:IBOutletCollection的使用方法 - CocoaChina_让移动开发更简单。这里用IBOutletCollection主要还是为了方便能够在IB中方便操作,其实用NSArray实现也是一样的。


RadioButton.m中最主要的方法

setGroupButtons方法

如果用IB方式进行组合的话,这个方法不需要你去主动调用。其实这个方法做的工作就是遍历buttons,然后通过NSValue的valueWithNonretainedObject方法将buttons设置到sharedLinks数组里面。为什么取sharedLink这个名字,主要是因为这些buttons引用的是同一个sharedLinks。之后其他的方法就是围绕着sharedLinks去操作,并通过NSValue的nonretainedObjectValue获取之前封装的值。注意:这里为什么要多此一举的用NSValue的两个方法,其实这里存在一个循环引用的问题,而NSValue的两个方法就是为了弱化这层关系,大家可以好好琢磨。


选中操作

选中之后的操作会执行这几个方法,主要是设置当前RadioButton选中状态,然后循环便利其他RadioButton状态为未选中状态。如果是用IB进行操作的话,选中和未选中的状态的背景可以通过如下图方法设置:


设置选中和未选中的背景图

鸣谢:http://www.jianshu.com/p/4971424c693b