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
你可以在调用类中设置委托