Note that there are some explanatory texts on larger screens.

plurals
  1. POUISliders lose target action when in UIView
    text
    copied!<p>I am trying to create a page of UISliders. The amount of sliders is dynamic.</p> <p>I have a PageViewController class and when I put the UISliders in a subview of PageViewController the sliders work.</p> <p>I would like to encapsulate the sliders into a UIView subclass so I can save their state/change coupled labels, etc. However when I do it the sliders stop working. I've tried a few things and am at the point to where I think I may just be missing a fundamental understanding that hopefully someone can point out.</p> <p>This works (from PageViewController.m):</p> <pre><code>if ([[controlData type] isEqualToString:@"SliderInt"]) { NSDictionary *data = controlData.data; NSLog(@"build SliderInt %@ %@ %@", [controlData.data objectForKey:@"min"], [controlData.data objectForKey:@"max"], [controlData.data objectForKey:@"value"]); CGRect frame = CGRectMake(startX, startY, 200.0, 22.00); UISlider *slider = [[UISlider alloc] initWithFrame:frame]; [slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged]; slider.minimumValue = 0.0; slider.maximumValue = 50.0; slider.continuous = YES; slider.value = 25.0; CGRect labelFrame = CGRectMake(startX, startY+22.0, 100.0, 30.0); UILabel *minLabel = [[UILabel alloc] initWithFrame:labelFrame]; [minLabel setFont:[UIFont systemFontOfSize:12]]; minLabel.textAlignment = UITextAlignmentLeft; [minLabel setText:@"minLabel:"]; labelFrame = CGRectMake(startX+200.0, startY+22.0, 100.0, 30.0); UILabel *maxLabel = [[UILabel alloc] initWithFrame:labelFrame]; [maxLabel setFont:[UIFont systemFontOfSize:12]]; maxLabel.textAlignment = UITextAlignmentLeft; [maxLabel setText:@"maxLabel:"]; labelFrame = CGRectMake(startX+220.0, startY+0.0, 100.0, 30.0); UILabel *valueLabel = [[UILabel alloc] initWithFrame:labelFrame]; [valueLabel setFont:[UIFont systemFontOfSize:12]]; valueLabel.textAlignment = UITextAlignmentLeft; [valueLabel setText:@"valueLabel:"]; minLabel.text = [data objectForKey:@"min"]; maxLabel.text = [data objectForKey:@"max"]; valueLabel.text = [data objectForKey:@"value"]; slider.minimumValue = [[data objectForKey:@"min"] intValue]; slider.maximumValue = [[data objectForKey:@"max"] intValue]; slider.value = [[data objectForKey:@"value"] intValue]; // [contentView addSubview:slider]; [contentView addSubview:minLabel]; [contentView addSubview:maxLabel]; [contentView addSubview:valueLabel]; [slider release]; [minLabel release]; [maxLabel release]; [valueLabel release]; startY+=60; } if ([[controlData type] isEqualToString:@"SliderFloat"]) { NSLog(@"build SliderFloat"); } </code></pre> <p>However moving it into this class breaks it</p> <pre><code>@interface SliderIntView : UIView { UILabel *minLabel; UILabel *maxLabel; UILabel *valueLabel; UISlider *slider; NSDictionary *data; } @property(nonatomic, retain) UISlider *slider; @property(nonatomic, retain) UILabel *minLabel; @property(nonatomic, retain) UILabel *maxLabel; @property(nonatomic, retain) UILabel *valueLabel; @property(nonatomic, retain) NSDictionary *data; - (id)initWithFrame:(CGRect)frame withData:(NSDictionary *)controlData; -(void) sliderAction:(id) sender; @end </code></pre> <p>The implementation</p> <pre><code>#import "SliderIntView.h" @implementation SliderIntView @synthesize slider, minLabel, maxLabel, valueLabel, data; - (id)initWithFrame:(CGRect)frame withData:(NSDictionary *) controlData { self = [super initWithFrame:frame]; if (self) { self.data = controlData; float startX = frame.origin.x; float startY = frame.origin.y; slider = [[UISlider alloc] initWithFrame:frame]; [slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventTouchUpInside]; CGRect labelFrame = CGRectMake(startX, startY+22.0, 100.0, 30.0); minLabel = [[UILabel alloc] initWithFrame:labelFrame]; [minLabel setFont:[UIFont systemFontOfSize:12]]; minLabel.textAlignment = UITextAlignmentLeft; [minLabel setText:@"minLabel:"]; labelFrame = CGRectMake(startX+200.0, startY+22.0, 100.0, 30.0); maxLabel = [[UILabel alloc] initWithFrame:labelFrame]; [maxLabel setFont:[UIFont systemFontOfSize:12]]; maxLabel.textAlignment = UITextAlignmentLeft; [maxLabel setText:@"maxLabel:"]; labelFrame = CGRectMake(startX+220.0, startY+0.0, 100.0, 30.0); valueLabel = [[UILabel alloc] initWithFrame:labelFrame]; [valueLabel setFont:[UIFont systemFontOfSize:12]]; valueLabel.textAlignment = UITextAlignmentLeft; [valueLabel setText:@"valueLabel:"]; minLabel.text = [data objectForKey:@"min"]; maxLabel.text = [data objectForKey:@"max"]; valueLabel.text = [data objectForKey:@"value"]; slider.minimumValue = [[data objectForKey:@"min"] intValue]; slider.maximumValue = [[data objectForKey:@"max"] intValue]; slider.value = [[data objectForKey:@"value"] intValue]; [self addSubview:slider]; //[self addSubview:maxLabel]; //[self addSubview:minLabel]; //[self addSubview:valueLabel]; } return self; } -(void) sliderAction:(id) sender { NSLog("@never happens"); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload