Core Plot 1.0 how to implement reloadData method?
Asked Answered
P

2

5

I asked this question yesterday and got some great help from Eric Skroch. However, I am still a bit confused after looking over all the documentation on the Core Plot website along with some examples. So I am going to post the code I have so far, and see if anyone can help me out some more. Maybe it will be a bit easier for Eric to help as well. My problem is that I need to remove a plot and then replace it with another in a tabbed app. Eric and others have said to use the reloadData method. But I don't see where I can use it in my code? Here are my header and implementation files.

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

@interface GraphViewController : UIViewController <CPTPlotDataSource>

@property (nonatomic, strong) CPTGraphHostingView *hostView;
@property (nonatomic, strong) NSMutableArray *myData;
@property (nonatomic) float XAXISMIN;
@property (nonatomic) float XAXISMAX;
@property (nonatomic) float YAXISMIN;
@property (nonatomic) float YAXISMAX;
@property (strong, nonatomic) IBOutlet UILabel *noGraph;

@end

and

#import "GraphViewController.h"
#import "MyVariables.h"  // a singleton class for my variables

@interface GraphViewController ()

@end

@implementation GraphViewController

@synthesize  hostView = _hostView;
@synthesize myData = _myData;
@synthesize XAXISMIN;
@synthesize XAXISMAX;
@synthesize YAXISMAX;
@synthesize noGraph;
@synthesize YAXISMIN;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[noGraph setText:@""];
}

- (void)viewDidAppear:(BOOL)animated
{

[super viewDidAppear:animated];
MyVariables *sharedVariables2 = [MyVariables sharedVariables2];
float a = [sharedVariables2.AA floatValue];
MyVariables *sharedVariables3 = [MyVariables sharedVariables3];
float b = [sharedVariables3.BB floatValue];    
MyVariables *sharedVariables4 = [MyVariables sharedVariables4];
float c = [sharedVariables4.CC floatValue];

float d = (4.0f)*a*c;
float e = (b*b);
float f = (e - d);
float g = sqrtf(f);
float h = -b;
float i = h + g;
float ii = h - g;
float j = i/(2*a);
float k = ii/(2*a);

// Define x max and min with answers to quad
XAXISMIN = j - (5.0);
XAXISMAX = k + (5.0);

// Find range for the y axis  STILL NEEDS WORK!
// maybe if statement for negatives
float z = c - ((b*b)/((4.0f)*a));
YAXISMAX = z + 10.0f;
YAXISMIN = -z;

float inc = (XAXISMAX - XAXISMIN) / 100.0f;
float l = XAXISMIN;

if ((isnan(g))  || (a == 0))
{ 
    [noGraph setText:@"This is not graphable"];
    [_hostView setHidden:YES];
}
else 
{
    NSMutableArray *data = [NSMutableArray array];

    for (int i = 0; i < 100; i ++)
    {

        float y = (a * (l*l)) + (b * l) + c;

        NSString *str4 = [NSString stringWithFormat:@"%.3f", l];
        NSString *str5 = [NSString stringWithFormat:@"%.3f", y];

        NSLog(@"Our X and Y are : %@, %@", str4, str5);
        [data addObject:[NSValue valueWithCGPoint:CGPointMake(l, y)]];
        l = l + inc;


    }
    self.myData = data;  // put that data array into the array you synthesized
    [self initPlot];   
}
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}

- (void)viewDidUnload
{   
[self setNoGraph:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

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

- (NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:  (NSUInteger)index
{
if ([plot.identifier isEqual:@"Your data"])
{
    NSValue *value = [self.myData objectAtIndex:index];
    CGPoint point = [value CGPointValue];

    // FieldEnum determines if we return an X or Y value.
    if (fieldEnum == CPTScatterPlotFieldX) 
    {
        return [NSNumber numberWithFloat:point.x];
    }
    else    // Y-Axis
    {
        return [NSNumber numberWithFloat:point.y];
    }
}
return [NSNumber numberWithFloat:0];
}

- (void)initPlot
{
[self configureHost];
[self configureGraph];
[self configurePlots];
[self configureAxes];

}

- (void)configureHost
{
self.hostView = [(CPTGraphHostingView *) [CPTGraphHostingView alloc] initWithFrame:self.view.bounds]; 
self.hostView.allowPinchScaling = YES;
[self.view addSubview:self.hostView];
}

- (void)configureGraph
{
// 1 - Create graph
CPTGraph *graph = [[CPTXYGraph alloc] initWithFrame:self.hostView.bounds];
self.hostView.hostedGraph = graph;


// 2 - Set graph title
NSString *title = @"Your Quadratic";
graph.title = title;

// 3 - Create and set text style
CPTMutableTextStyle *titleStyle = [CPTMutableTextStyle textStyle];
titleStyle.color = [CPTColor whiteColor];
titleStyle.fontName = @"Helvetica-Bold";
titleStyle.fontSize = 16.0f;
graph.titleTextStyle = titleStyle;
graph.titlePlotAreaFrameAnchor = CPTRectAnchorTop;
graph.titleDisplacement = CGPointMake(0.0f, 10.0f);

// 4 - Set padding for plot area
[graph.plotAreaFrame setPaddingTop:30.0f];
[graph.plotAreaFrame setPaddingRight:30.0f];
[graph.plotAreaFrame setPaddingLeft:30.0f];
[graph.plotAreaFrame setPaddingBottom:30.0f];

// 5 - Enable use interaction for plot space
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.allowsUserInteraction = YES;
}

- (void)configurePlots
{
// 1 - Get graph and plot spaces and set axis
CPTGraph *graph = self.hostView.hostedGraph;
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) graph.defaultPlotSpace;

float xAxisMin = XAXISMIN;
float xAxisMax = XAXISMAX;
float yAxisMin = YAXISMIN;
float yAxisMax = YAXISMAX;

plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(xAxisMin) length:CPTDecimalFromFloat(xAxisMax - xAxisMin)];
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(yAxisMin) length:CPTDecimalFromFloat(yAxisMax - yAxisMin)];

// 2 - Create the plot
CPTScatterPlot *quadGraph = [[CPTScatterPlot alloc] init];
quadGraph.dataSource = self;
quadGraph.identifier = @"Your data";
CPTColor *quadColor = [CPTColor blackColor];
[graph addPlot:quadGraph toPlotSpace:plotSpace];

// 4 - Create styles and symbols
CPTMutableLineStyle *quadLineStyle = [quadGraph.dataLineStyle mutableCopy];
quadLineStyle.lineWidth = 2.5;
quadLineStyle.lineColor = quadColor;
quadGraph.dataLineStyle = quadLineStyle;

CPTMutableLineStyle *quadSymbolLineStyle = [CPTMutableLineStyle lineStyle];
quadSymbolLineStyle.lineColor = quadColor;

CPTPlotSymbol *quadSymbol = [CPTPlotSymbol ellipsePlotSymbol];
quadSymbol.fill = [CPTFill fillWithColor:quadColor];
quadSymbol.lineStyle = quadSymbolLineStyle;
quadSymbol.size = CGSizeMake(6.0f, 6.0f);
quadGraph.plotSymbol = quadSymbol;

}

- (void)configureAxes
{
// 1 - Create styles
CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
axisTitleStyle.color = [CPTColor whiteColor];
axisTitleStyle.fontName = @"Helvetica-Bold";
axisTitleStyle.fontSize = 12.0f;
CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
axisLineStyle.lineWidth = 2.0f;
axisLineStyle.lineColor = [CPTColor whiteColor];
CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
axisTextStyle.color = [CPTColor whiteColor];
axisTextStyle.fontName = @"Helvetica-Bold";    
axisTextStyle.fontSize = 11.0f;
CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle];
tickLineStyle.lineColor = [CPTColor whiteColor];
tickLineStyle.lineWidth = 2.0f;
CPTMutableLineStyle *gridLineStyle = [CPTMutableLineStyle lineStyle];
tickLineStyle.lineColor = [CPTColor blackColor];
tickLineStyle.lineWidth = 1.0f;

// 2 - Get axis set
CPTXYAxisSet *axisSet = (CPTXYAxisSet *) self.hostView.hostedGraph.axisSet;

// 3 - Configure x-axis
CPTAxis *x = axisSet.xAxis;
x.title = @"X Axis"; 
x.titleTextStyle = axisTitleStyle;    
x.titleOffset = 1.0f;
x.axisLineStyle = axisLineStyle;
x.labelingPolicy = CPTAxisLabelingPolicyEqualDivisions; //CPTAxisLabelingPolicyNone;
x.labelTextStyle = axisTextStyle;    
x.majorTickLineStyle = axisLineStyle;
x.majorTickLength = 4.0f;
x.tickDirection = CPTSignPositive; //CPTSignNegative;

// 4 - Configure y-axis
CPTAxis *y = axisSet.yAxis;    
y.title = @"Y Axis";
y.titleTextStyle = axisTitleStyle;
y.titleOffset = -40.0f;       
y.axisLineStyle = axisLineStyle;
y.majorGridLineStyle = gridLineStyle;
y.labelingPolicy = CPTAxisLabelingPolicyEqualDivisions;
y.labelTextStyle = axisTextStyle;    
y.labelOffset = 16.0f;
y.majorTickLineStyle = axisLineStyle;
y.majorTickLength = 4.0f;
y.minorTickLength = 2.0f;    
y.tickDirection = CPTSignNegative;

}

@end

So I hope someone can let me know where to clear my data/plot so I only have one graph on the graph tab at a time. Thanks so much in advance!

Phytography answered 26/8, 2012 at 19:46 Comment(0)
P
6

You should initialize and configure the graph and hosting view (i.e., call -initPlot) in -viewDidLoad so that it only happens once. In -viewDidAppear, do whatever data processing you need to prepare it for the graph and then call -reloadData.

Parrnell answered 26/8, 2012 at 21:46 Comment(8)
Thanks so much for clearing that up! I will try those things and let you know how it works. Won't be able to get to it until tomorrow. But thanks so much!Phytography
Well, I couldn't wait so I did your suggestions. I placed [self initPlot] in viewDidLoad right after [super viewDidLoad]. Then in viewDidAppear after filling my array I used [self.hostView.hostedGraph reloadData]. But the graph doesn't load at all. I can see the x and y axis in the bottom left corner all bunched together. Any ideas? What am I doing wrong? Thanks......AGAIN!Phytography
Do I still need to set up -(void)reloadData? If so what do I put in there?Phytography
Core Plot graphs and plots have a -reloadData method. You do not need to do anything other than call it at the appropriate time.Parrnell
Well that is good, but do you know when the appropriate time is for my code. The graph will only be created if I use initPlot during the viewDidAppear. Not during viewDidLoad. I have tried [self.hostView.hostedGraph reloadData] at many different locations. Is this the correct syntax? Thanks.Phytography
That reload statement should work. -viewDidAppear: is the right place for it—after you fill the new myData array. Do you have an .xib for this view or are you creating everything in code?Parrnell
I am using storyboards. I made a UIView that I called hostView. And I placed that in the viewcontroller.Phytography
so the only way for my graph to appear is if I call initPlot from viewDidAppear. Is there a way I can just remove the entire graph from the hostView upon viewDidDisappear, or something like that? Thanks. Also, the graph does not clear still with the reloadData method.Phytography
P
4

Well, for anyone following this question, I have found the answer. With much help and guidance from Eric Skroch, he lead me in the right direction. At least I think I did the right thing! Since my graph was only being created with the viewDidAppear method, I had to find another way to use reloadData. So I NSLogged several methods to see which one was called when the view went away, I found viewWillDisappear was one of them. So in this method I used the following;

self.hostView.hostedGraph = nil;

and

[_myData removeAllObjects];.

This clears the graph and gets it ready for the next, and empties my Array to get that ready as well. I would love to hear anyone's comments as to what they think about my workaround. I am going to accept Eric's answer though, because without his help, I would not have gotten this far. Thanks again!

Phytography answered 27/8, 2012 at 22:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.