2

分割ビュー コントローラーの詳細ビューに CPXYGraph を読み込もうとしています。プロット データを表示しようとすると、EXC_BAD_ACCESS が発生します。

「分割ビューベースのアプリケーション」に基づいて新しいプロジェクトを作成します。CorePlot フレームワークを追加した後、次の変更を行います。

1- GraphController (.m、.h、および .xib) を追加します。xib には、タイプ CPLayerHostingView の従属ビューを持つ UIView が含まれています。2- 次の行をアプリ デリゲート didFinishLaunchingWithOptions に追加します。

 [detailViewController performSelector:@selector(configureView) withObject:nil afterDelay:0];

3- DetailViewController configureView に以下を追加します

 CGRect graphFrame = CGRectMake(0, 43, 662, 450);
 GraphController *graphController = [[[GraphController alloc]
   initWithNibName:@"GraphController" bundle:nil] autorelease];
 [graphController.view setFrame:graphFrame];
 [self.view addSubview:graphController.view];
 [graphController reloadData];

4- GraphController の reloadData メソッドは、CorePlot サンプル (DatePlot) の 1 つからほとんど貼り付けられているので、ここに (ほとんど) コピーして貼り付けます。

-(void)reloadData
{
    if (!graph)
    {
        [self parentViewController];
        [self.view addSubview:layerHost];

        // Create graph from theme
        graph = [[CPXYGraph alloc] initWithFrame:CGRectZero];
        CPTheme *theme = [CPTheme themeNamed:@"Dark Gradients"];
        [graph applyTheme:theme];
        ....
        [layerHost setHostedLayer: graph];
        ....
        // Setup scatter plot space
        CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
        NSTimeInterval xLow = 0.0f;
        plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(xLow) length:CPDecimalFromFloat(oneDay*5.0f)];
        plotSpace.yRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(1.0) length:CPDecimalFromFloat(3.0)];

        // Axes
        CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet;
        CPXYAxis *x = axisSet.xAxis;
        x.majorIntervalLength = CPDecimalFromFloat(oneDay);
        x.orthogonalCoordinateDecimal = CPDecimalFromString(@"2");
        x.minorTicksPerInterval = 0;
        NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        dateFormatter.dateStyle = kCFDateFormatterShortStyle;
        CPTimeFormatter *timeFormatter = [[[CPTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease];
        timeFormatter.referenceDate = refDate;
        x.labelFormatter = timeFormatter;

        CPXYAxis *y = axisSet.yAxis;
        y.majorIntervalLength = CPDecimalFromString(@"0.5");
        y.minorTicksPerInterval = 5;
        y.orthogonalCoordinateDecimal = CPDecimalFromFloat(oneDay);

        // Create a plot that uses the data source method
        CPScatterPlot *dataSourceLinePlot = [[[CPScatterPlot alloc] init] autorelease];
        dataSourceLinePlot.identifier = @"Date Plot";
        dataSourceLinePlot.dataLineStyle.lineWidth = 3.f;
        dataSourceLinePlot.dataLineStyle.lineColor = [CPColor greenColor];
        dataSourceLinePlot.dataSource = self;
        **[graph addPlot:dataSourceLinePlot];**

        // Add some data
        NSMutableArray *newData = [NSMutableArray array];
        NSUInteger i;
        for ( i = 0; i < 5; i++ ) {
            NSTimeInterval x = oneDay*i;
            id y = [NSDecimalNumber numberWithFloat:1.2*rand()/(float)RAND_MAX + 1.2];
            [newData addObject:
             [NSDictionary dictionaryWithObjectsAndKeys:
              [NSDecimalNumber numberWithFloat:x], [NSNumber numberWithInt:CPScatterPlotFieldX], 
              y, [NSNumber numberWithInt:CPScatterPlotFieldY], 
              nil]];
        }
        plotData = newData;
    }
}

問題のある行は [graph addPlot:dataSourceLinePlot]; です。これをコメントアウトすると、シミュレーターが起動し、グラフの x 軸と y 軸が表示されますが、もちろんデータは表示されません。この行を追加すると、次の SIGART-

2010-09-15 14:35:58.959 SplitViewWithCorePlot[17301:207] relabel <<CPScatterPlot: 0x4c458c0> bounds: {{0, 0}, {558, 386}}>
Program received signal:  “EXC_BAD_ACCESS”.

誰でも助けることができますか?

4

1 に答える 1

0

データ配列をどこにも保持しているようには見えません。最後のステートメントを次のように変更してみてください

plotData = [newData retain];

または、プロパティが定義されている場合は、

self.plotData = newData;

エリック

于 2010-09-15T23:00:24.197 に答える