coreplot - всегда один и тот же сюжет - PullRequest
1 голос
/ 20 марта 2012

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

я боюсь, что пропустил жизненно важную функцию или концепцию coreplot =)

я реализовал:

numberofRecords
doubleForPlot

и отладка (особенно doubleForPlot) снова и снова, и я на 100% уверен, что doubleforplot действительно возвращает правильный double для данного индекса.

но: показанный график равен всегда то же самое.я получаю строку (скриншот внизу вопроса).

я пробовал: отладка doubleForPlot - он возвращает правильное число разные данные я пытался всегда возвращатьто же число, ожидая увидеть постоянную строку, результат: пустой график . разные данные я попытался вернуть некоторые другие значения (не постоянные), но затем я снова получил график показанных снимков экрана.

вот мой код:

IBAction - вызывает инициализацию данных и создает графическое представление

-(IBAction)displayDayBalanceGraph:(id)sender{
if (hasSubView) {

    //[[expenseTable subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
    [self updateView];
    NSLog(@"%@",expenseTable.subviews);
}

else{

    [self initializeMonthArray];

    CPTGraphHostingView *host = [self buildGraphView];

    [expenseTable addSubview:host];

    graph = [[CPTXYGraph alloc ]initWithFrame:host.frame];
    [graph setDelegate:self];


    // CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme];
    // [graph applyTheme:theme];
    host.hostedGraph = graph;


    CPTScatterPlot *plot = [[CPTScatterPlot alloc]init ];
    plot.dataSource = self;
    [plot setIdentifier:@"balanceChart"];

    [plot setTitle:@"Balance History"];


    [graph addPlot:plot];


    hasSubView = !hasSubView;
}

}

Create View - инициализирует представление хостинга с правильным размером

-(CPTGraphHostingView *)buildGraphView{

CPTGraphHostingView *view = [[CPTGraphHostingView alloc]initWithFrame:CGRectMake(0, 0, 312, 220)];
[view setBackgroundColor:[self grayColor]];

return view;
}

инициализация данных - вызывается при нажатии на IBAction для отображения графика

-(void)initializeMonthArray{

[dataHandler updateData];

if (!allMonthExpenses) {
    allMonthExpenses = [[NSMutableArray alloc]initWithCapacity:31];
} 

for (NSMutableArray *temp in allMonthExpenses) {
    [temp removeAllObjects];
}

[allMonthExpenses removeAllObjects];

for (int j = 0; j < 31; j++) {          //fill with 31 empty mutuable arrays
    NSMutableArray *tempArray = [[NSMutableArray alloc]init];
    [allMonthExpenses addObject:tempArray];
}

for (Expense *exp in dataHandler.allMonthExpenses) {
    if (exp.expenseType.boolValue == 0) {
        [[allMonthExpenses objectAtIndex:(exp.day.intValue-1)]addObject:exp];
    }
}
}

doubleForPlot - возвращает правый дубль для индекса

-(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index{

if (fieldEnum == 0) {

    NSLog(@"Axis: %d and Value: %d",fieldEnum, index+1);
    return (double)(index+1);
}

if (fieldEnum == 1) {

    int dayInt = [dataHandler getDayNumber:[NSDate date]].intValue;
    double total = 0;
    for (Expense *exp in [allMonthExpenses objectAtIndex:index]) {
        total = total + exp.value.doubleValue;
    }

    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:(-(dayInt-(int)index-1)*(60*60*24))];

    double budgetValue = [dataHandler getSpecificBudgetForDate:[NSDate dateWithTimeIntervalSinceNow:(-(dayInt-(int)index-1)*(60*60*24))] ];
    total = budgetValue+total;    

    NSLog(@"\n Axis:%d \n Record for Day: %@ \n IndexForPlot: %d \n Value: %.2f \n",fieldEnum, date,index,total);

    return total;
}

else
    return 0;
}

numberOfRecords - возвращает правильное количество записей

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot{    
return [dataHandler getDayNumber:[NSDate date]].intValue;

}

снимок экрана - график, который отображается независимо от того, какие данные я ввожу

le stupid empty plot

LOG - этот журнал создается в конце метода doubleforplot, доказывая, что возвращается правильный результат:

NSLog(@"\n Record for Day: %@ \n IndexForPlot: %d \n Value: %.2f \n",date,index,total);

out:

2012-03-20 10:29:55.834 DailyBudget[9493:fb03] 
Record for Day: 2012-03-01 09:29:55 +0000 
 IndexForPlot: 0 
 Value: 34.35 
2012-03-20 10:29:55.841 DailyBudget[9493:fb03] 
 Record for Day: 2012-03-02 09:29:55 +0000 
 IndexForPlot: 1 
 Value: 8.35 
2012-03-20 10:29:55.848 DailyBudget[9493:fb03] 
 Record for Day: 2012-03-03 09:29:55 +0000 
 IndexForPlot: 2 
 Value: 35.83 
2012-03-20 10:29:55.856 DailyBudget[9493:fb03] 
 Record for Day: 2012-03-04 09:29:55 +0000 
 IndexForPlot: 3 
 Value: -14.89 
2012-03-20 10:29:55.863 DailyBudget[9493:fb03] 
 Record for Day: 2012-03-05 09:29:55 +0000 
 IndexForPlot: 4 
 Value: 36.56 
2012-03-20 10:29:55.869 DailyBudget[9493:fb03] 
 Record for Day: 2012-03-06 09:29:55 +0000 
 IndexForPlot: 5 
 Value: 8.96 

.... sparing you a lot of other log except the last.

2012-03-20 10:29:55.980 DailyBudget[9493:fb03] 
 Record for Day: 2012-03-20 09:29:55 +0000 
 IndexForPlot: 19 
 Value: 14.33 

1 Ответ

1 голос
/ 20 марта 2012

Я думаю, что это простая ошибка. Каждая точка линии, нарисованной на графике, должна иметь значения x и y. Вы возвращаете одно и то же значение для x и y. Вы можете дифференцировать его по значению поля в методе

-(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index;

. fieldenum будет нулевым для CPTScatterPlotFieldX и 1 для CPTScatterPlotFieldY.

...