Cell中新增Switch元件如何執行不同的函式

xDEHANG發表於2019-02-15

OneSwift – iOS Tips Based On Swift

Switch元件頻繁使用於使用者設定、自定義等場景,當Switch元件只有一個時,它的資料繫結、函式繫結和狀態切換都相對簡單,只需要對一個Switch進行操作即可。

但是,當我們在TableViewCollectionView中複用多個Switch時,就需要一個更好的方式去同時實現多個資料繫結、函式繫結和狀態切換。

在這裡先說明一下:

資料繫結是指需要判斷當前Switch的初始值狀態;
函式繫結是指點選不同的Switch執行不同的函式;
狀態切換是指點選之後我們需要改變Switch的狀態;

下面以CollectionView中使用多個Switch為例,進行實踐演練。

1.建立Switch元件

建立Switch元件,設定identifyCellSwitch

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()
複製程式碼

最後看看效果

多個Switch演示

GitHub:OneSwift – iOS Tips Based On Swift

微博:xDEHANG

相關文章