Reveclair
Reveclair

Reputation: 2421

Methods for datasource are not called for this custom view

I would like to implement this sort of thing :

enter image description here

1- So first, I have implemented this view : UnitSliderView :

enter image description here

using this code :

#import "UnitSliderView.h"

@implementation UnitSliderView

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self != nil)
    {
        //initialization
        self.backgroundColor = [UIColor grayColor];
        [self initViews];
        [self initConstraints];
    }
    return self;
}

-(void)initViews
{
    _leftLabel = [[UILabel alloc] init];
    _leftLabel.textColor = [UIColor whiteColor];
    //self.leftLabel.text = @"John";
    [self addSubview:_leftLabel];
    
    _rightLabel = [[UILabel alloc] init];
    _rightLabel.textColor = [UIColor whiteColor];
    //self.rightLabel.text = @"20%";
    [self addSubview:self.rightLabel];
    
    _slider = [[UISlider alloc] init];
    _slider.value = 0.6;
    [self addSubview:_slider];
}


-(void)initConstraints
{
    self.rightLabel.translatesAutoresizingMaskIntoConstraints = NO;
    self.leftLabel.translatesAutoresizingMaskIntoConstraints = NO;
    self.slider.translatesAutoresizingMaskIntoConstraints = NO;
    
    id views = @{
                 @"leftLabel": self.leftLabel,
                 @"slider": self.slider,
                 @"rightLabel": self.rightLabel,
                 };
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[leftLabel(==90)]-5-[slider(==120)]-[rightLabel(==50)]-|" options:0 metrics:nil views:views]];
    
    
    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.slider attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.leftLabel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.rightLabel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];
}
@end

2- Then, I have created this view, named MultiSliderView, which use the precedent View (UnitSliderView):

#import "MultiSliderView.h"  
#import "UnitSliderView.h"

static const int kUnitsCount = 3;

@implementation MultiSliderView

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self != nil)
    {
        //initialization
        self.backgroundColor = [UIColor clearColor];
        [self initViews];
    }
    return self;
}

- (void)initViews {
    
    float totalHeight = self.frame.size.height;
    float spacingRatio = 0.1;
    float heightPerUnit = totalHeight/(kUnitsCount+spacingRatio*(kUnitsCount));
    
    for (int i = 0; i < kUnitsCount; i++)
    {
        double percentage = [self.dataSource valueForSliderAtIndex:i];
        NSString *leftString = [self.dataSource stringForLeftLabelAtIndex:i];
        NSString *rightString = [self.dataSource stringForRightLabelAtIndex:i];
        UnitSliderView *unit = [[UnitSliderView alloc] initWithFrame:CGRectMake(0, i*heightPerUnit + (i)*heightPerUnit*spacingRatio, self.frame.size.width, heightPerUnit)];
        unit.slider.value = percentage;
        unit.leftLabel.text = leftString;
        unit.rightLabel.text = rightString;
        [self addSubview:unit];
    }   
}    
@end

3 - problem : when I init a MultiSlidersView in a viewController, the datasource methods that I have implemented in this same view controller are not called, thus the labels are not shown, and the slider values are 0.

I think there some of my code is not in the right place, but I can't find how to do it differently.

Upvotes: 0

Views: 32

Answers (2)

vib
vib

Reputation: 2274

You should define the dataSource of the created class before you call the init function. You should define a method initWithFrame:(CGRect)frame andDataSource:(id <MultiSliderViewDataSource> ) dataSource and use it to initialize your view.

Upvotes: 1

Reinhard M&#228;nner
Reinhard M&#228;nner

Reputation: 15247

I assume you want to get an action called whenever the slide value changes. Since you implemented everything in code, you can do this in code using e.g.

[youSlider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];

Upvotes: 0

Related Questions