Core-Plot: метки данных для столбчатых графиков (2 графика, 2 набора меток)?

#core-plot #labels #cptbarplot

#core-plot #метка #cptbarplot

Вопрос:

В моем приложении для 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];
}
  

Ответ №1:

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

 CPTTextLayer *label;
if (plot.identifier == @"Bar Plot 1") {
    label = ...;
}
else {
    label = ...;
}
return [label autorelease];
  

Комментарии:

1. Потрясающе, Эрик. Я пробовал это раньше, и мне не повезло. Теперь, с вашей хорошей кармой, это работает. Спасибо миллион.

Ответ №2:

plot.identifier == @"Bar Plot 1"

должно быть:

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