How to implement bar chart in iPhone?
Asked Answered
C

2

9

I am working in simple bar chart application, Using Coreplot to develop this application, then i try to implement the bar chart but i get the issue found in

  [__NSCFConstantString sizeWithTextStyle:]: unrecognized selector sent to instance 0x7fb4c'
   First throw call stack:

How to fix this? please help me

Thanks in Advance

I tried this:

Viewcontroller.h

#import <UIKit/UIKit.h>
#import "CorePlot-CocoaTouch.h"


@interface GraphViewController : UIViewController <CPTPlotDataSource>
{
    CPTXYGraph *barChart;
    NSTimer *timer;
    NSMutableArray *samples;
}

-(void) getGraphValues;

@end

Viewcontroller.m

 - (void)viewDidLoad
    {
        [super viewDidLoad];

        self.view.backgroundColor=[UIColor whiteColor];
        self.title = @"Sample";
        self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
        [self.navigationController setNavigationBarHidden:NO];

        [self getGraphValues];

        double xAxisLength = [samples count];

        barChart = [[CPTXYGraph alloc] initWithFrame:CGRectMake(0, 0, 320, 380)];

        barChart.plotAreaFrame.borderLineStyle = nil;
        barChart.plotAreaFrame.cornerRadius = 0.0f;

        barChart.paddingLeft = 0.0f;
        barChart.paddingRight = 0.0f;
        barChart.paddingTop = 0.0f;
        barChart.paddingBottom = 0.0f;

        barChart.plotAreaFrame.paddingLeft = 60.0;
        barChart.plotAreaFrame.paddingTop = 40.0;
        barChart.plotAreaFrame.paddingRight = 10.0;
        barChart.plotAreaFrame.paddingBottom = 40.0;

        barChart.title = @"Sample Innovations";

        CPTMutableTextStyle *textStyle = [CPTTextStyle textStyle];
        textStyle.color = [CPTColor grayColor];
        textStyle.fontSize = 16.0f;
        textStyle.textAlignment = CPTTextAlignmentCenter;
        barChart.titleTextStyle = textStyle;  // Error found here
        barChart.titleDisplacement = CGPointMake(0.0f, -10.0f);
        barChart.titlePlotAreaFrameAnchor = CPTRectAnchorTop;

        CPTXYAxisSet *axisSet = (CPTXYAxisSet *)barChart.axisSet;
        CPTXYAxis *x = axisSet.xAxis;
        x.axisLineStyle = nil;
        x.majorTickLineStyle = nil;
        x.minorTickLineStyle = nil;
        x.majorIntervalLength = CPTDecimalFromString(@"10");
        x.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0");
        x.title = @"Names";
        x.titleLocation = CPTDecimalFromFloat(7.5f);
        x.titleOffset = 25.0f;

        // Define some custom labels for the data elements
        x.labelRotation = M_PI/5;
        x.labelingPolicy = CPTAxisLabelingPolicyNone;

        NSArray *customTickLocations = [NSArray arrayWithObjects:[NSDecimalNumber numberWithInt:0], [NSDecimalNumber numberWithInt:1], [NSDecimalNumber numberWithInt:2], [NSDecimalNumber numberWithInt:3], [NSDecimalNumber numberWithInt:4], nil];


        NSArray *xAxisLabels = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", @"e", nil];
        NSUInteger labelLocation = 0;

        NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:[xAxisLabels count]];
        for (NSNumber *tickLocation in customTickLocations) 
        {
            CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText: [xAxisLabels objectAtIndex:labelLocation++] textStyle:x.labelTextStyle];
            newLabel.tickLocation = [tickLocation decimalValue];
            newLabel.offset = x.labelOffset + x.majorTickLength;
            newLabel.rotation = M_PI/xAxisLength;
            [customLabels addObject:newLabel];
        }

        x.axisLabels =  [NSSet setWithArray:customLabels];

        CPTXYAxis *y = axisSet.yAxis;
        y.axisLineStyle = nil;
        y.majorTickLineStyle = nil;
        y.minorTickLineStyle = nil;
        y.majorIntervalLength = CPTDecimalFromString(@"50");
        y.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0");
        y.title = @"Work Status";
        y.titleOffset = 40.0f;
        y.titleLocation = CPTDecimalFromFloat(150.0f);

        CPTGraphHostingView *hostingView = [[CPTGraphHostingView alloc] initWithFrame:CGRectMake(0, 0, 320, 360)];
        hostingView.hostedGraph = barChart;
        [self.view addSubview:hostingView];

        CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) barChart.defaultPlotSpace;
        plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0f) length:CPTDecimalFromDouble(16.0f)];
        plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0f) length:CPTDecimalFromDouble(500.0f)];

        CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO];
        barPlot.plotRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(10)];//xAxisLength
        barPlot.barOffset = CPTDecimalFromFloat(0.25f);
        barPlot.baseValue = CPTDecimalFromString(@"0");
        barPlot.barWidth = CPTDecimalFromFloat(10.0f);
        barPlot.cornerRadius = 2.0f;
        barPlot.dataSource = self;
        [barChart addPlot:barPlot];
    }

    -(void) getGraphValues
    {
        int barValues [] = {10,50,100,200};//,150,200,10,20,30,40,50,100,400,450,350
        int barNums = sizeof(barValues) / sizeof(int);

        samples = [[NSMutableArray alloc] initWithCapacity:barNums];

        for (int i = 0; i < 4; i++)
        {
            double x = i;
            double y = barValues[i];
            NSLog(@"XVal : %@", X_VAL);
            NSDictionary *sample = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithDouble:30],X_VAL,[NSNumber numberWithDouble:y],Y_VAL,nil];
            [samples addObject:sample];
        }   
    }


-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot 
{
    return [samples count];
}

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index 
{
    NSDictionary *sample = [samples objectAtIndex:index];

    if (fieldEnum == CPTScatterPlotFieldX)
        return [sample valueForKey:X_VAL];
    else
        return [sample valueForKey:Y_VAL];
}
Citron answered 8/9, 2012 at 11:52 Comment(1)
You know what that error message means, correct? (And appending the call stack at the point of error would be very helpful in diagnosing this.)Yonatan
P
17

Make sure you set the -all_load "other linker flag" in the build settings. That flag forces the system to load all category methods like -sizeWithTextStyle:.

Propagate answered 8/9, 2012 at 12:45 Comment(2)
Sorry to say this, can u please geive any example for thisCitron
Have you read the Core Plot wiki?Propagate
T
10

As Eric has explained, you need to se the -all_load flag in the build settings. In case you are wondering where this exactly is have a look at this picture. Good luck!

Setting the all_add flag on XCode

Thera answered 20/10, 2012 at 8:44 Comment(1)
For all who had the same trouble as I did locating the linker settings, make sure "All" settings is selected instead of the default "Basic" settings. I hate make files.Appointment

© 2022 - 2024 — McMap. All rights reserved.