versiones guia espaƱol descargar actualizar ios cocoa-touch uiswitch

ios - guia - Detectando un cambio en UISwitch



qgis manual (8)

Aquí hay una solución que funciona para mí. También envía una notificación de propiedad "cambiará / cambió" cuando se cambia el interruptor. El evento también funciona correctamente, ya que los valores de antes y después se mantienen correctamente.

@interface MySwitch : UISwitch @end @implementation MySwitch { BOOL _previousValue; BOOL _returnPreviousValue; } - (instancetype) initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder: aDecoder]; if (!self) return nil; _previousValue = self.isOn; [self addTarget: self action: @selector(_didChange) forControlEvents: UIControlEventValueChanged]; return self; } - (instancetype) initWithFrame: (CGRect) frame { self = [super initWithFrame: frame]; if (!self) return nil; [self addTarget: self action: @selector(_didChange) forControlEvents: UIControlEventValueChanged]; return self; } - (BOOL) isOn { return (_returnPreviousValue) ? _previousValue : [super isOn]; } - (void) setOn:(BOOL) on animated: (BOOL) animated { [super setOn: on animated: animated]; _previousValue = on; } - (void) _didChange { BOOL isOn = self.isOn; if (isOn == _previousValue) return; _returnPreviousValue = true; [self willChangeValueForKey: @"on"]; _returnPreviousValue = false; _previousValue = isOn; [self didChangeValueForKey: @"on"]; } @end

Esto suena trivial pero estoy notando algo raro. He conectado un controlador para el evento Value Changed de un UISwitch. Lo que esperaría es que cada vez que se llame al controlador, el valor del conmutador cambiaría. Pero en realidad no siempre es así. Si presiona el interruptor de encendido / apagado rápido, se puede llamar al controlador de forma consecutiva con el MISMO estado para el interruptor (en mi aplicación específica, esto es un problema). Así que me pregunto si alguien más ha notado este comportamiento y ha descubierto una buena solución.


Cada vez que lo presiona, no se activa / desactiva el interruptor de inmediato. Si el interruptor está en la posición de apagado, puede presionar un par de veces antes de que se anime a la posición de encendido. Cada una de estas prensas se interpreta como "encender el interruptor", ya que no se considera "encendido" hasta que la animación se haya completado. Obtendrá una devolución de llamada "valueChanged" para cada pulsación a pesar del hecho de que el valor no ha cambiado todavía.


Cuando se desactiva / desactiva el interruptor, se ha llamado al "valor cambiado". Por lo tanto, puede detectar un cambio en el interruptor llamando al método en valueChanged.


En iOS 11 se introdujo un nuevo error de UISwitch, por lo que no recomiendo suscribirse a eventos de valor cambiado. De lo contrario, su devolución de llamada se activará cada vez que el atributo isOn cambie programáticamente.

En lugar:

1) Suscríbete para retoque dentro del evento:

let switch = UISwitch() switch.addTarget(self, action: #selector(onSwitchValueChanged), for: .touchUpInside)

2) Implementar el método de devolución de llamada:

func onSwitchValueChanged(_ switch: UISwitch) { }

3) Y ahora, cuando cambias isOn valor de isOn , no activará el método onSwitchValueChanged .

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


Mi problema era estúpido ... Esperaba que el valor enabled cambiara, pero obviamente ese no es el valor correcto para inspeccionar el interruptor, el on o el isOn es lo correcto que se debe usar.


Obtener el estado del interruptor en el controlador:

- (void)valueChanged:(UISwitch *)theSwitch { BOOL flag = theSwitch.on; }


Registre el último estado para que pueda saber si su estado cambiado o si se ha activado con el mismo estado.


-(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; }