在点击手势上调用UIISlider valueChanged方法

时间:2014-12-09 23:04:11

标签: ios objective-c uislider

我有一个UISlider的子类连接到valueChanged的故事板:

- (IBAction)valueChanged:(RSSlider*)slider {
    // do some super cool stuff with my new value
}

在我的子类viewDidLoad中,我得到了:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sliderTapped:)];
[self addGestureRecognizer:gestureRecognizer];

然后在同一个子类中,一个漂亮的点击处理程序,可以移动滑块并更新当前值:

- (void)sliderTapped:(UIGestureRecognizer *)tap
{
    if (self.highlighted)
        return;
    CGPoint locationInView = [tap locationInView: self];
    CGFloat percentage = locationInView.x / self.bounds.size.width;
    CGFloat delta = percentage * (self.maximumValue - self.minimumValue);
    CGFloat value = self.minimumValue + delta;
    [self setValue:value];
}

一切都好,价值设定,生活继续。但唯一的问题是,我在视图控制器中的Storyboard处理程序(我们称之为委托,但显然不是真的)永远不会被调用。

如果通过点击更改了值,我该如何触发对处理程序方法的更新?

1 个答案:

答案 0 :(得分:1)

正如您所提到的,处理此问题的一种方法是通过代表。

由于UISlider没有用于更改值的预定义委托方法,因此您可以在子类中创建自己的协议。让View Controller符合该协议,并通过delegate属性调用其方法。

以下是协议和代理创建的示例:

@protocol RSSliderDelegate
- (void)changeValue:(RSSlider*)slider;
@end

@interface RSSlider: UISlider

@property (nonatomic, assign) id<RSSliderDelegate> delegate;

然后将VC设置为符合协议:

@interface ViewController : UIViewController <RSSliderDelegate>

然后只需在创建滑块时设置它:

RSSlider* rs = [[RSSlider alloc] init];
[rs setDelegate: self];

实施方法:

- (void)changeValue:(RSSlider*)slider
{
    //Do some cool stuff
}

最后,从子类本身调用该方法:

[self.delegate changeValue:self];