我在应用程序中将UISwitch
与valueChanged
目标一起使用,如下面的代码所示。
此开关位于我的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
这种方法。
什么是最好的方法。
如何区分天气用户更改了开关状态还是以编程方式更改了开关状态。
答案 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)