Базовый график: метки данных для гистограмм (2 графика, 2 набора меток)? - PullRequest
3 голосов
/ 16 октября 2011

В моем приложении для iPhone у меня есть два отдельных столбчатых графика.Каждый график имеет разное количество элементов данных.Я хотел бы пометить каждую полосу на каждом графике соответствующими данными, но, очевидно, метод «dataLabelForPlot» допускает только один экземпляр «CPTTextLayer».Я хотел бы, чтобы CPTTextLayer был функцией графика и его данных.

Графики имеют отдельные идентификаторы: «Столбец 1» и «Столбец 2».Я могу использовать условный оператор if в методах «numberOfRecordsForPlot» и «numberForPlot», но в методе «dataLabelForPlot» произойдет сбой из-за ошибок, говорящих о том, что «label» является неиспользуемой переменной.Мне кажется очень странным видеть, что это определено в условных выражениях.

Мой код выглядит так:

#pragma mark Plot Data Source Methods
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
if (plot.identifier == @"Bar Plot 1") {
    return 5; }
  else { return 4; }
}
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index {
    NSDecimalNumber *num = nil;
if (plot.identifier == @"Bar Plot 1") {
    switch ( fieldEnum ) {
        case CPTBarPlotFieldBarLocation:
            num = (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:index];
            break;
        case CPTBarPlotFieldBarTip:               
            num = (NSDecimalNumber *)[dataTemp1 objectAtIndex:index];                
            break;
    }
}
else {
    switch ( fieldEnum ) {
        case CPTBarPlotFieldBarLocation:
            num = (NSDecimalNumber *)[NSDecimalNumber numberWithUnsignedInteger:index];
            break;
        case CPTBarPlotFieldBarTip:                
            num = (NSDecimalNumber *)[dataTemp2 objectAtIndex:index];
            break;
    }
}
    return num;
}

-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index {
  if (plot.identifier == @"Bar Plot 1") {
    CPTTextLayer *label = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%@", [dataTemp1 objectAtIndex:index]]]; 
    }
  else { CPTTextLayer *label = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%@", [dataTemp2 objectAtIndex:index]]]; }    
    CPTMutableTextStyle *textStyle = [label.textStyle mutableCopy];

    textStyle.color = [CPTColor redColor];
    label.textStyle = textStyle;
    [textStyle release];
return [label autorelease];
}

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Вы объявили label внутри каждого из блоков if и else, сделав его локальным для этих блоков. Переместите объявление переменной перед оператором if.

CPTTextLayer *label;
if (plot.identifier == @"Bar Plot 1") {
    label = ...;
}
else {
    label = ...;
}
return [label autorelease];
2 голосов
/ 30 декабря 2011

plot.identifier == @"Bar Plot 1"

должно быть:

[plot.identifier isEqualToString: @"Bar Plot 1"

...