segmented how example control iphone ios ios5 uisegmentedcontrol

iphone - how - swift 4 segmented control example



El evento de cambio UISegmentedControl no se activa en iOS5 (2)

Tengo un UISegmentedControl cuyo evento "Value changed" está conectado en Interface Builder para llamar a mi controlador -(IBAction)segmentChangeAction:(id)sender;

Cuando el usuario toca el control para cambiar el segmento seleccionado, se llama segmento esperadoChangeAction segmentChangeAction sea ​​en iOS4 o iOS5.

Cuando programáticamente cambio el segmento seleccionado a través de segmentedControl.selectedSegmentIndex = newIndex; , en iOS4 se llama segmentChangeAction y el segmento refleja la nueva selección. Sin embargo, en iOS5 no se llama segmentChangeAction , pero el segmento sí refleja la nueva selección.

¿Es esto un cambio en iOS5? ¿Hay algo que pueda hacer para llamar a segmentChangeAction en iOS5 cuando modifique la selección por programación?


Encontré otra manera, probablemente un poco más fácil de entender, puedes extender UISegmentedControl y agregar acción objetivo en métodos init y llamar a un método de delegado para activar el cambio de valor

aquí está el código de ejemplo

archivo de encabezado se ve así

#import <UIKit/UIKit.h> @class CGUISegmentedControl; @protocol CGUISegmentedControlDelegate <NSObject> @optional - (void) segmentedControl:(CGUISegmentedControl *) control valueChangedTo:(NSInteger) nValue; @end @interface CGUISegmentedControl : UISegmentedControl @property (nonatomic,unsafe_unretained) id <CGUISegmentedControlDelegate> delegate; @end

archivo .m

#import "CGUISegmentedControl.h" @implementation CGUISegmentedControl @synthesize delegate = _delegateAction; - (void) addTargetAction { [self addTarget:self action:@selector(indexChanged:) forControlEvents:UIControlEventValueChanged]; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self addTargetAction]; } return self; } - (id) initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self addTargetAction]; } return self; } - (id) initWithItems:(NSArray *)items { self = [super initWithItems:items]; if (self) { [self addTargetAction]; } return self; } - (id) init { self = [super init]; if (self) { [self addTargetAction]; } return self; } - (void) indexChanged:(id) sender { if (_delegateAction && [_delegateAction respondsToSelector:@selector(segmentedControl:valueChangedTo:)]) [_delegateAction segmentedControl:self valueChangedTo:self.selectedSegmentIndex]; } @end

Y puede configurar el delegado en la clase de llamada


Este es un cambio en iOS 5 para que UISegmentedControl sea ​​coherente con todos los demás controles.

La idea es que la acción solo se active automáticamente como resultado de la interacción del usuario. Antes de iOS 5, las acciones de UISegmentedControl se dispararían debido a la interacción del usuario y la interacción programática. Sin embargo, iniciar el cambio mediante programación significa que también puede hacer [myControl sendActionsForControlEvents:UIControlEventValueChanged] usted mismo.

Sin embargo, debes tener cuidado con esto. Di que haces:

[segmentedControl setSelectedSegmentIndex:newIndex]; [segmentedControl sendActionsForControlEvents:UIControlEventValueChanged];

Si compila y ejecuta esto en iOS 5, funciona como espera. Si compila y ejecuta esto en iOS 4, obtendrá sus acciones disparadas dos veces (una cuando setSelectedSegmentIndex y otra cuando sendActions... ).

La forma de evitar esto es hacer algún tipo de guardia. Esto podría ser un control en tiempo de ejecución para indicar que está ejecutando en un dispositivo iOS 5+, o incluso podría ser algo más mundano, como este:

// changingIndex is a BOOL ivar changingIndex = YES; [segmentedControl setSelectedSegmentIndex:newIndex]; changingIndex = NO; [segmentedControl sendActionsForControlEvents:UIControlEventValueChanged];

y luego en tu método de acción ...

- (void)segmentedControlSelectedIndexChanged:(id)sender { if (!changingIndex) { // your action code here, guaranteed to only run as a result of the sendActions... msg } }