如何在iPhone中实现条形图?

时间:2012-09-08 11:52:10

标签: iphone core-plot bar-chart

我在简单的条形图应用程序中工作,使用Coreplot开发此应用程序,然后我尝试实现条形图,但我得到了

中发现的问题
  [__NSCFConstantString sizeWithTextStyle:]: unrecognized selector sent to instance 0x7fb4c'
   First throw call stack:

如何解决这个问题? 请帮帮我

先谢谢

我试过了:

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];
}

2 个答案:

答案 0 :(得分:17)

确保设置-all_load和#34;其他链接器标记&#34;在构建设置中。该标志强制系统加载所有类别方法,如-sizeWithTextStyle:

答案 1 :(得分:10)

正如Eric所解释的那样,您需要在构建设置中看到-all_load标志。 万一你想知道这到底在哪里看看这张照片。 祝你好运!

Setting the all_add flag on XCode