我有一个UISegmentedControl,其“Value changed”事件在Interface Builder中连接,以调用我的控制器-(IBAction)segmentChangeAction:(id)sender;
当用户点击控件以更改所选片段时,无论是在iOS4还是iOS5中,都会调用预期的segmentChangeAction
。
当我通过segmentedControl.selectedSegmentIndex = newIndex;
以编程方式更改所选细分时,在iOS4 segmentChangeAction
上调用该细分,并且该细分反映新选择。但是在iOS5 segmentChangeAction
上未被调用,但该段确实反映了新的选择。
这是iOS5的变化吗?当我以编程方式更改选择时,我可以做些什么来在iOS5上调用segmentChangeAction
吗?
答案 0 :(得分:70)
这是iOS 5中的更改,以使UISegmentedControl
与所有其他控件保持一致。
我们的想法是,操作只应在用户交互时自动触发。在iOS 5之前,由于用户交互和程序化交互,UISegmentedControl
的操作将被触发。但是,以编程方式启动更改意味着您也可以自己[myControl sendActionsForControlEvents:UIControlEventValueChanged]
。
但是,你必须小心这一点。说你做:
[segmentedControl setSelectedSegmentIndex:newIndex];
[segmentedControl sendActionsForControlEvents:UIControlEventValueChanged];
如果您在iOS 5上构建并运行它,它可以按预期工作。如果您在iOS 4上构建并运行此操作,则会在<{1}}时(<{1}}时再次触发> 一次
}。解决这个问题的方法是做一些防守。这可能是运行时检查,表明您在iOS 5+设备上运行,或者甚至可能是更平凡的事情,如下所示:
setSelectedSegmentIndex
然后在你的行动方法......
sendActions...
答案 1 :(得分:5)
我找到了另一种方式,可能更容易理解 您可以扩展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
您可以在调用类
中设置委托