Swift/UISwitch:如何实现委托/监听器

Sag*_*usA 23 uitableview uiswitch ios swift

在我的UITableViewController中,我有一个自定义单元格,其中包含一个切换器,如下所示:

import Foundation
import UIKit

class SwitchCell: UITableViewCell {
  @IBOutlet weak var label : UILabel!
  @IBOutlet weak var switchEmail : UISwitch!

  func setEditable(canEdit:Bool) {
      if (canEdit) {
        self.switchEmail.enabled = true
        self.label.highlighted = false
      }
      else {
          self.switchEmail.enabled = false
          self.label.highlighted = true
      }
  }

  func configureCellWithSwitch(labelText:String, switchValue:Bool, enabled:Bool) {

    var labelFrame:CGRect = self.label.frame
    labelFrame.size.height = Settings.labelHeight
    self.label.frame = labelFrame

    self.label.text = labelText

    if (switchValue) {
        self.switchEmail.setOn(true, animated: true)
    }
    else {
        self.switchEmail.setOn(false, animated: true)
    }

    self.setEditable(enabled)

  }
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何实现切换器的侦听器/委托,以便从UITableViewController获取其值.我能够为UITextField和UITextView实现这些方法的单元格编写委托/监听器

func controller(controller: UITableViewCell, textViewDidEndEditing: String, atIndex: Int)
Run Code Online (Sandbox Code Playgroud)

func controller(controller: UITableViewCell, textFieldDidEndEditingWithText: String, atIndex: Int)
Run Code Online (Sandbox Code Playgroud)

但我不知道应该实现切换器.

Dan*_*iel 71

UISwitch没有代表协议.您可以按如下方式收听状态:

ObjC:

// somewhere in your setup:
[self.mySwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];


- (void)switchChanged:(UISwitch *)sender {
   // Do something
   BOOL value = sender.on;
}
Run Code Online (Sandbox Code Playgroud)

迅速:

mySwitch.addTarget(self, action: "switchChanged:", forControlEvents: UIControlEvents.ValueChanged)

func switchChanged(mySwitch: UISwitch) {
   let value = mySwitch.on
   // Do something
}
Run Code Online (Sandbox Code Playgroud)

Swift3:

mySwitch.addTarget(self, action: #selector(switchChanged), for: UIControlEvents.valueChanged)

func switchChanged(mySwitch: UISwitch) {
    let value = mySwitch.isOn
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

Swift4:

mySwitch.addTarget(self, action: #selector(switchChanged), for: UIControl.Event.valueChanged)

@objc func switchChanged(mySwitch: UISwitch) {
    let value = mySwitch.isOn
    // Do something
}
Run Code Online (Sandbox Code Playgroud)


Muj*_*tif 10

在Swift4.0中

mySwitch.addTarget(self, action: #selector(valueChange), for:UIControlEvents.valueChanged)

 @objc func valueChange(mySwitch: UISwitch) {
        let value = mySwitch.isOn
        // Do something
        print("switch value changed \(value)")
    }
Run Code Online (Sandbox Code Playgroud)


A.G*_*A.G 7

斯威夫特3:

使用Storyboard Autolayout:

添加参考:

@IBOutlet weak var sampleSwitch: UISwitch!
Run Code Online (Sandbox Code Playgroud)

关联方法:

@IBAction func sampleSwitchValueChanged(_ sender: Any) {

    if sampleSwitch.isOn {
        print("ON")  
    }
    else {
        print ("OFF")
    }
}
Run Code Online (Sandbox Code Playgroud)

程序方式:

添加目标:

sampleSwitch.addTarget(self, action: #selector(ViewController.sampleSwitchValueChanged(sender:)), for: UIControlEvents.valueChanged)
Run Code Online (Sandbox Code Playgroud)

与交换机关联的方法:

   func sampleSwitchValueChanged(sender: UISwitch!)
    {
        if sender.isOn {

            print("switch on")

        } else {

        }
    }
Run Code Online (Sandbox Code Playgroud)


Ann*_*awn 5

另一种(Swift 3或4)方法是使用didSet观察者并大幅度减少代码,例如,

在类声明中声明一个变量,如下所示:

var switchFlag: Bool = false {
        didSet{               //This will fire everytime the value for switchFlag is set
            print(switchFlag) //do something with the switchFlag variable
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后你就可以有一个IBActionUISwitch像这样

@IBAction func switchChanged(_ sender: Any) {
        if self.mySwitch.isOn{
            switchFlag = true
        }else{
            switchFlag = false
        }
    }
Run Code Online (Sandbox Code Playgroud)


Kha*_*lam 5

在 Swift 5 中

switchDemo.addTarget(self, action: #selector(didTapAdvertise), for:UIControl.Event.valueChanged)

@objc func didTapAdvertise(mySwitch: UISwitch) {
        let value = mySwitch.isOn
        // Do something
        print("switch value changed \(value)")
    }
Run Code Online (Sandbox Code Playgroud)