2015-11-06 2 views
0

Я хотел бы реализовать такую ​​вещь:методы источника данных не вызываются для этого пользовательского вида

enter image description here

1- Итак, сначала я реализовал эту точку зрения: UnitSliderView:

enter image description here

, используя этот код:

#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- Тогда я создал этот вид, названный MultiSliderView, которые используют прецедентный 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 - проблема: когда я инициализации в MultiSlidersView в ViewController, методы DATASOURCE что Я реализовал в этом же представлении контроллер не вызывается, поэтому метки не отображаются, а значения ползунка равны 0.

Я думаю, что некоторые из моих кодов не в нужном месте, но я не могу найти как это сделать по-другому.

ответ

1

Вы должны определить DataSource созданного класса перед тем вызове функции инициализации. Вы должны определить метод initWithFrame:(CGRect)frame andDataSource:(id <MultiSliderViewDataSource>) dataSource и использовать его для инициализации вашего представления.

+0

Он решил мою проблему, спасибо. Но я не уверен, что это решение очень аккуратное. – Reveclair

0

Я предполагаю, что вы хотите получить действие при каждом изменении значения слайда. Поскольку вы реализовали все в коде, вы можете сделать это в коде, используя, например,

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