我有一个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处理程序(我们称之为委托,但显然不是真的)永远不会被调用。
如果通过点击更改了值,我该如何触发对处理程序方法的更新?
答案 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];