Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UISwitch值更改状态问题_Ios_Swift_Uiswitch - Fatal编程技术网

Ios UISwitch值更改状态问题

Ios UISwitch值更改状态问题,ios,swift,uiswitch,Ios,Swift,Uiswitch,我在我的应用程序中使用了UISwitch,其valueChanged目标如下代码所示。 此开关位于myUITableView settingsTableCell.androidSwitchSmall.addTarget(self, action: #selector(switchStateChanged(_:)), for: .valueChanged) @objc func switchStateChanged(_ mjSwitch: MJMaterialSwitch) { if

我在我的应用程序中使用了
UISwitch
,其
valueChanged
目标如下代码所示。 此开关位于my
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()
}
我正在改变目标方法中开关的值。因此,它再次调用
switchStateChanged
方法

但我只想在用户更改开关状态时调用
switchStateChanged
此方法

最好的办法是什么

如何区分用户是否更改了开关状态或开关状态是以编程方式更改的。

按照以下步骤操作

第1步

选项卡视图单元格中创建一个变量

var Btn1 : (()->())? 
步骤2

选项卡elviewcell
中创建ui按钮的操作,并调用上面的
变量

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

视图控制器中声明
Bool
变量和
函数

var IsSwitchOn = false

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

cellForRowAt indepath
中调用此函数

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

cell.Btn1 = {
              () in
              Self.switchStateChanged()
        }
希望这能奏效

按照以下步骤操作

第1步

选项卡视图单元格中创建一个变量

var Btn1 : (()->())? 
步骤2

选项卡elviewcell
中创建ui按钮的操作,并调用上面的
变量

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

视图控制器中声明
Bool
变量和
函数

var IsSwitchOn = false

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

cellForRowAt indepath
中调用此函数

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

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

希望这能奏效

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

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

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

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

你为什么不在里面用触碰呢。这将仅在用户与开关交互时触发选择器

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

你为什么不在里面用触碰呢。这将仅在用户与开关交互时触发选择器

settingsTableCell.androidSwitchSmall.addTarget(self, action: #selector(switchStateChanged(_:)), for: .touchUpInside)
UISwitch.setOn(mjSwitch)(真,动画:假)
UISwitch.setOn(mjSwitch)(真,动画:假)