检测UISwitch中的更改

Joh*_*ohn 20 cocoa-touch uiswitch ios

这听起来微不足道,但我注意到一些奇怪.我为UISwitch的Value Changed事件连接了一个处理程序.我期望的是每次调用处理程序时,开关的值都会改变.但是,这其实并不总是如此.如果您快速打开/关闭开关,则可以使用交换机的SAME状态连续调用处理程序(在我的特定应用程序中,这是一个问题).所以我想知道是否有其他人注意到这种行为,并找到了一个很好的解决方案.

use*_*951 18

   -(void) createSwitch
    {
        self.searchExistSearchNewSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0,0,0,0)];
        [self.searchExistSearchNewSwitch addTarget:self action:@selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged];
        [self.view addSubview:self.searchExistSearchNewSwitch];
    }
    - (void)switchValueChanged:(UISwitch *)theSwitch
    {
        BOOL flag = theSwitch.isOn;
    }
Run Code Online (Sandbox Code Playgroud)


Erd*_*mus 8

获取处理程序中的switch状态:

- (void)valueChanged:(UISwitch *)theSwitch {
   BOOL flag = theSwitch.on;
}
Run Code Online (Sandbox Code Playgroud)


ant*_*awn 7

您所做的每次按下都不会立即打开/关闭开关.如果开关处于关闭位置,您可以在其动画到开启位置之前进行几次按压.这些按下中的每一个都被解释为"打开开关",因为在动画完成之前它不会被视为"开启".尽管该值尚未实际改变,但每次按下都会得到一个"valueChanged"回调函数.


Vad*_*vin 5

在iOS 11中,引入了新的UISwitch错误,因此我不建议订阅值更改事件。否则,你的回调函数会被触发,每次UISwitchisOn属性以编程方式更改。

代替:

1)订阅内部事件的补全:

let switch = UISwitch()
switch.addTarget(self, action: #selector(onSwitchValueChanged), for: .touchUpInside)
Run Code Online (Sandbox Code Playgroud)

2)实现回调方法:

func onSwitchValueChanged(_ switch: UISwitch) {

}
Run Code Online (Sandbox Code Playgroud)

3)现在,当您以编程方式更改isOn值时,它不会触发onSwitchValueChanged方法。

switch.isOn = !switch.isOn // 'onSwitchValueChanged' is not triggered


Ben*_*Ben 0

记录最后的状态,以便您可以判断其状态是否已更改或已被相同的状态触发。