UISwitch值更改状态问题

时间:2019-04-04 10:37:12

标签: ios swift uiswitch

我在应用程序中将UISwitchvalueChanged目标一起使用,如下面的代码所示。 此开关位于我的UITableView

settingsTableCell.androidSwitchSmall.addTarget(self, action: #selector(switchStateChanged(_:)), for: .valueChanged)


@objc func switchStateChanged(_ mjSwitch: MJMaterialSwitch) {
    if self.lastSwitchState == mjSwitch.isOn {
        return
    }
    self.lastSwitchState = mjSwitch.isOn
    print(mjSwitch.isOn, mjSwitch.tag, "Small")
    self.changeTrackStatus()
}

我正在目标方法中更改Switch的值。因此它再次调用switchStateChanged方法。

但是,仅当用户更改开关状态时,我才想调用switchStateChanged这种方法。

什么是最好的方法。

如何区分天气用户更改了开关状态还是以编程方式更改了开关状态。

3 个答案:

答案 0 :(得分:0)

按照步骤进行。

  

步骤-1

TabelView Cell

中创建变量
var Btn1 : (()->())? 
  

步骤-2

TabelViewCell内创建UIButton的动作,并在Variable上方调用。

@IBAction func cellbtn(_ sender: UIButton) {
        Btn1?()
 }
  

步骤-3

在您的Bool中声明一个Function变量和您的View Controller

var IsSwitchOn = false

 func switchStateChanged(_ mjSwitch: MJMaterialSwitch) {
    if self.IsSwitchOn {
        return
    }
    self.IsSwitchOn = True
    print(mjSwitch.isOn, mjSwitch.tag, "Small")
    self.changeTrackStatus()
}
  

步骤-4

cellForRowAt indexPath中调用它。

let cell = tableView.dequeueReusableCell(withIdentifier: "CellID") as! YourCell

cell.Btn1 = {
              () in
              Self.switchStateChanged()
        }

希望这行得通。

答案 1 :(得分:0)

您必须以编程方式发送操作, 您可以使用以下扩展名

extension UISwitch {
    func set(on state: Bool, animated: Bool = true) {
        setOn(state, animated: animated)
        sendActions(for: .valueChanged)
    }
}

答案 2 :(得分:0)

为什么不使用.touchUpInside。仅当用户与开关交互时,才会触发选择器。

settingsTableCell.androidSwitchSmall.addTarget(self, action: #selector(switchStateChanged(_:)), for: .touchUpInside)