Switch
组件频繁使用于用户设置、自定义等场景,当Switch
组件只有一个时,它的数据绑定、函数绑定和状态切换都相对简单,只需要对一个Switch
进行操作即可。
但是,当我们在TableView
和CollectionView
中复用多个Switch
时,就需要一个更好的方式去同时实现多个数据绑定、函数绑定和状态切换。
在这里先说明一下:
数据绑定是指需要判断当前Switch
的初始值状态; 函数绑定是指点击不同的Switch
执行不同的函数; 状态切换是指点击之后我们需要改变Switch
的状态;
下面以CollectionView
中使用多个Switch
为例,进行实践演练。
1.创建Switch
组件
创建Switch
组件,设置identify
为CellSwitch
2.区分与标识Switch
通过在cellForItemAt
中设置Switch
的不同tag
值,来区分Switch
这里我以
cell.CellSwitch.tag = indexPath.row复制代码
3.Switch
初始化状态加载
在cellForItemAt
中加载Switch
的各种颜色和当前状态。 当然要明确不同的indexPath.row
对应什么值,对应的Switch
加载不同的初始状态,以OneClock自定义设置中的三个值为例,我调用coredata
的值进行了初始化状态的加载。
switch indexPath.row { case 0: print("indexpath",indexPath.row) if self.appDelegate.mytheme.timeFormat == Int64(0){ cell.CellSwitch.isOn = true }else{ cell.CellSwitch.isOn = false } case 1: print("indexpath",indexPath.row) if self.appDelegate.mytheme.showFormat == Int64(0){ cell.CellSwitch.isOn = true }else{ cell.CellSwitch.isOn = false } case 2: print("indexpath",indexPath.row) if self.appDelegate.mytheme.oneClickMenu == Int64(0){ cell.CellSwitch.isOn = true }else{ cell.CellSwitch.isOn = false } default: print("default") }复制代码
4.Switch
函数绑定
同样在cellForItemAt
中加载Switch
的函数self.switchAction(_ :)
,代码如下:
cell.CellSwitch.addTarget(self, action: #selector(self.switchAction(_ :)), for: .touchUpInside)复制代码
当然,这里的核心是self.switchAction(_ :)
函数本身,刚刚我们已经给每个Switch
加了tag
,因此在这个函数中,我们就只需要判断tag
值进行不同的函数操作即可。
@objc func switchAction(_ sender: UISwitch){ switch sender.tag { case 0: print("indexpath",sender.tag) if self.appDelegate.mytheme.timeFormat == Int64(0){ self.appDelegate.mytheme.timeFormat = Int64(1) }else{ self.appDelegate.mytheme.timeFormat = Int64(0) } case 1: print("indexpath",sender.tag) if self.appDelegate.mytheme.showFormat == Int64(0){ self.appDelegate.mytheme.showFormat = Int64(1) }else{ self.appDelegate.mytheme.showFormat = Int64(0) } case 2: print("indexpath",sender.tag) if self.appDelegate.mytheme.oneClickMenu == Int64(0){ self.appDelegate.mytheme.oneClickMenu = Int64(1) }else{ self.appDelegate.mytheme.oneClickMenu = Int64(0) } default: print("default") } }复制代码
5.改变Switch
状态
只要初始状态和函数改变的方式统一,每次点击都能获得正确的状态和值的改变,也可以在每次执行self.switchAction(_ :)
时,加入整个CollectionView
的重置:
self.CustomCollection.reload()复制代码
最后看看效果
GitHub:
微博: