iOS单选框RadioButton实现

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

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

先看效果图:

 

RadioButton

接下来我们分析下源码:

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

 

RadioButton.h

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

 

IBOutletCollection结合iB

RadioButton.m中最主要的方法

 

setGroupButtons方法

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

 

选中操作

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

 

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

如果理解有错误的地方,欢迎大家可以指出来,一起探讨。

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 6 收藏 评论

关于作者:千客

iOS攻城狮一枚,暂无多大的成就,喜欢开源,一心为开源做贡献 个人主页 · 我的文章 · 1 ·      

可能感兴趣的话题



直接登录
跳到底部
返回顶部