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:OneSwift – iOS Tips Based On Swift
微博:xDEHANG