UISegmentedControl更改事件不在iOS5中触发

我有一个UISegmentedControl其“价值改变”事件在Interface Builder中连线,以调用我的控制器-(IBAction)segmentChangeAction:(id)sender;

当用户点击控件来更改选定的段时,无论在iOS4还是iOS5中,都会按预期segmentChangeAction

当我以编程方式更改选定的段segmentedControl.selectedSegmentIndex = newIndex; ,在iOS4 segmentChangeAction被调用,并且该段反映了新的select。 然而在iOS5上segmentChangeAction 没有被调用,但是该段确实反映了新的select。

这是iOS5的变化吗? 有没有什么我可以做的,以获得在iOS5上调用segmentChangeAction ,当我以编程方式更改select?

这是为了使UISegmentedControl与所有其他控件一致,在iOS 5中进行了更改。

这个想法是,行动应该只是由于用户交互而自动触发。 在iOS 5之前,由于用户交互程序交互, UISegmentedControl的操作将被解雇。 但是,以编程方式启动更改意味着您也可以自己执行[myControl sendActionsForControlEvents:UIControlEventValueChanged]

但是,你必须小心这一点。 说你这样做:

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

如果你在iOS 5上构build并运行它,它就会像你期望的那样工作。 如果你在iOS 4上构build并运行它,你将会触发两次你的动作(当你设置了sendActions...时,再次发送动作时)。

解决这个问题的方法是做一些防范。 这可能是一个运行时检查,以表明您正在iOS 5+设备上运行,或者甚至可能是更平常的事情,如下所示:

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

然后在你的行动方法…

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

我发现另一种方法,可能更容易理解你可以扩展UISegmentedControl并在init方法中添加目标操作,并调用委托方法来触发值更改

这里是示例代码

头文件看起来像这样

 #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 

.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 

你可以在调用类中设置委托