UISegmentedControl更改事件未在iOS5中触发

时间:2011-11-08 17:38:41

标签: iphone ios ios5 uisegmentedcontrol

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

当用户点击控件以更改所选片段时,无论是在iOS4还是iOS5中,都会调用预期的segmentChangeAction

当我通过segmentedControl.selectedSegmentIndex = newIndex;以编程方式更改所选细分时,在iOS4 segmentChangeAction上调用该细分,并且该细分反映新选择。但是在iOS5 segmentChangeAction被调用,但该段确实反映了新的选择。

这是iOS5的变化吗?当我以编程方式更改选择时,我可以做些什么来在iOS5上调用segmentChangeAction吗?

2 个答案:

答案 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

您可以在调用类

中设置委托