2011-12-22 14 views
2

私はたくさんのコードを投稿していますが、質問は比較的シンプルです。 スタンドアロンオブジェクトとしてCTPXYGraphを作成し、それを別のViewControllerのhostedGraphとして使用しようとしています。CorePlotグラフを作成する

何らかの理由でクラッシュします。

RealTimePlot *plot = [[RealTimePlot alloc] init]; 
CTPXYGraph *graph = [plot createGraph]; 
self.graphHostingView.hostedGraph = graph; 

graphObject:

のViewController(EXC_BAD_ACCESS信号とアセンブリコードに私を取得します)

#import "CorePlot-CocoaTouch.h" 

@interface RealTimePlot : NSObject <CPTPlotDataSource> 
{ 
NSMutableArray *dataForPlot; 
} 

@property (readwrite, strong) NSMutableArray *dataForPlot; 

- (CPTXYGraph *) createGraph; 

@end 

実装:dealloc-

@implementation RealTimePlot 
@synthesize dataForPlot; 

- (CPTXYGraph *) createGraph: 
// Create graph from theme 
CPTXYGraph *graph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; 
CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; 
[graph applyTheme:theme]; 

graph.paddingLeft = 10.0; 
graph.paddingTop = 10.0; 
graph.paddingRight = 10.0; 
graph.paddingBottom = 10.0; 

// Setup plot space 
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; 
plotSpace.allowsUserInteraction = YES; 
plotSpace.xRange    = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.0) length:CPTDecimalFromFloat(2.0)]; 
plotSpace.yRange    = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.0) length:CPTDecimalFromFloat(3.0)]; 

// Axes 
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; 
CPTXYAxis *x   = axisSet.xAxis; 
x.majorIntervalLength   = CPTDecimalFromString(@"0.5"); 
x.orthogonalCoordinateDecimal = CPTDecimalFromString(@"2"); 
x.minorTicksPerInterval  = 2; 
NSArray *exclusionRanges = [NSArray arrayWithObjects: 
          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.99) length:CPTDecimalFromFloat(0.02)], 
          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.99) length:CPTDecimalFromFloat(0.02)], 
          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(2.99) length:CPTDecimalFromFloat(0.02)], 
          nil]; 
x.labelExclusionRanges = exclusionRanges; 

CPTXYAxis *y = axisSet.yAxis; 
y.majorIntervalLength   = CPTDecimalFromString(@"0.5"); 
y.minorTicksPerInterval  = 5; 
y.orthogonalCoordinateDecimal = CPTDecimalFromString(@"2"); 
exclusionRanges    = [NSArray arrayWithObjects: 
           [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.99) length:CPTDecimalFromFloat(0.02)], 
           [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.99) length:CPTDecimalFromFloat(0.02)], 
           [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(3.99) length:CPTDecimalFromFloat(0.02)], 
           nil]; 
y.labelExclusionRanges = exclusionRanges; 

// Create a blue plot area 
CPTScatterPlot *boundLinePlot = [[CPTScatterPlot alloc] init]; 
CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; 
lineStyle.miterLimit  = 1.0f; 
lineStyle.lineWidth   = 3.0f; 
lineStyle.lineColor   = [CPTColor blueColor]; 
boundLinePlot.dataLineStyle = lineStyle; 
boundLinePlot.identifier = @"Blue Plot"; 
boundLinePlot.dataSource = self; 
[graph addPlot:boundLinePlot]; 

// Do a blue gradient 
CPTColor *areaColor1  = [CPTColor colorWithComponentRed:0.3 green:0.3 blue:1.0 alpha:0.8]; 
CPTGradient *areaGradient1 = [CPTGradient gradientWithBeginningColor:areaColor1 endingColor:[CPTColor clearColor]]; 
areaGradient1.angle = -90.0f; 
CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient1]; 
boundLinePlot.areaFill  = areaGradientFill; 
boundLinePlot.areaBaseValue = [[NSDecimalNumber zero] decimalValue]; 

// Add plot symbols 
CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle]; 
symbolLineStyle.lineColor = [CPTColor blackColor]; 
CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; 
plotSymbol.fill   = [CPTFill fillWithColor:[CPTColor blueColor]]; 
plotSymbol.lineStyle  = symbolLineStyle; 
plotSymbol.size   = CGSizeMake(10.0, 10.0); 
boundLinePlot.plotSymbol = plotSymbol; 

// Create a green plot area 
CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init]; 
lineStyle      = [CPTMutableLineStyle lineStyle]; 
lineStyle.lineWidth    = 3.f; 
lineStyle.lineColor    = [CPTColor greenColor]; 
lineStyle.dashPattern   = [NSArray arrayWithObjects:[NSNumber numberWithFloat:5.0f], [NSNumber numberWithFloat:5.0f], nil]; 
dataSourceLinePlot.dataLineStyle = lineStyle; 
dataSourceLinePlot.identifier = @"Green Plot"; 
dataSourceLinePlot.dataSource = self; 

// Put an area gradient under the plot above 
CPTColor *areaColor  = [CPTColor colorWithComponentRed:0.3 green:1.0 blue:0.3 alpha:0.8]; 
CPTGradient *areaGradient = [CPTGradient gradientWithBeginningColor:areaColor endingColor:[CPTColor clearColor]]; 
areaGradient.angle    = -90.0f; 
areaGradientFill     = [CPTFill fillWithGradient:areaGradient]; 
dataSourceLinePlot.areaFill  = areaGradientFill; 
dataSourceLinePlot.areaBaseValue = CPTDecimalFromString(@"1.75"); 

// Animate in the new plot, as an example 
dataSourceLinePlot.opacity = 0.0f; 
[graph addPlot:dataSourceLinePlot]; 

CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
fadeInAnimation.duration   = 1.0f; 
fadeInAnimation.removedOnCompletion = NO; 
fadeInAnimation.fillMode   = kCAFillModeForwards; 
fadeInAnimation.toValue    = [NSNumber numberWithFloat:1.0]; 
[dataSourceLinePlot addAnimation:fadeInAnimation forKey:@"animateOpacity"]; 

// Add some initial data 
NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; 
NSUInteger i; 
for (i = 0; i < 60; i++) { 
    id x = [NSNumber numberWithFloat:1 + i * 0.05]; 
    id y = [NSNumber numberWithFloat:1.2 * rand()/(float)RAND_MAX + 1.2]; 
    [contentArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:x, @"x", y, @"y", nil]]; 
} 
self.dataForPlot = contentArray; 

return graph; 
} 
+0

スタックトレースを与える必要があります。これをデバッグするには、スタックがクラッシュする前にスタックトレースを教えてください。 –

+0

クラッシュログを投稿できますか? CorePlotのどのバージョンを使用していますか? –

+0

私は最新のものを使用しています(v0.9)。静的ライブラリとして。それはEXC_BAD_ACCESSを取得する – Rizon

答えて

2
RealTimePlot *plot = [[RealTimePlot alloc] init]; 

を得ていますed。

CPTGraphHostingViewは、hostedGraph ivarを保持していません。

関連する問題