Ruben Martinez Jr.
Ruben Martinez Jr.

Reputation: 3110

View Delegate Not Being Called

I'm building a graphing app, and I have a view and a view controller, which acts as a delegate for the view (to retrieve information). While I haven't started the actual drawing yet, I am currently trying to store values in a dictionary; however, I have certain NSLogs placed methodically across the view controller and I noticed that the delegate methods I call from the view don't get called at all. For example, I call my scaleForGraph function, but it does not execute. Being new to this, I'm not sure if there's something I'm missing. FYI: I have no errors, it compiles and executes. I've tried to slim the code down as much as possible. Thank you for your help!

Here's the .h for my view, where I define the protocol:

//  GraphView.h

#import <UIKit/UIKit.h>

@class GraphView;

@protocol GraphViewDelegate <NSObject>
- (float)scaleForGraph:(GraphView *)requestor;
-(NSMutableDictionary*) valuesForGraph:(GraphView *)requestor withWidth:(float) width;

@end

@interface GraphView : UIView
@property (nonatomic) id <GraphViewDelegate> delegate;
@property (nonatomic) id expressionCopy;

@end

And here's the .m:

#import "GraphView.h"

@implementation GraphView
@synthesize expressionCopy = _expressionCopy;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.contentMode = UIViewContentModeRedraw;
    }
    return self;
}

- (void)awakeFromNib
{
    self.contentMode = UIViewContentModeRedraw;
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGRect screenBound = [[UIScreen mainScreen] bounds];
    CGSize screenSize = screenBound.size;
    CGFloat width = screenSize.width;
    CGFloat height = screenSize.height;
    float scale = [self.delegate scaleForGraph:self];
    NSLog([NSString stringWithFormat:@"My Scale: %f",scale]); //always returns 0
    NSMutableDictionary *graphValues = [self.delegate valuesForGraph:self withWidth:width];
}
@end

And here's my view controller .h:

#import <UIKit/UIKit.h>
#import "GraphView.h"

@interface GraphingViewController : UIViewController <GraphViewDelegate>
@property (weak, nonatomic) IBOutlet GraphView *graphView;
@property (strong, nonatomic) IBOutlet UIStepper *stepper;
- (IBAction) changedScale:(UIStepper *)stepper;
@property (nonatomic) int scale;
@property (nonatomic) id expressionCopy;
@end

And here's the .m for the controller:

#import "GraphingViewController.h"
@interface GraphingViewController ()

@end

@implementation GraphingViewController
@synthesize expressionCopy = _expressionCopy;

- (void)updateUI
{
    self.stepper.value = self.scale;
    [self.graphView setNeedsDisplay];
}

- (void)setScale:(int)scale
{
    if (scale < 0) scale = 0;
    if (scale > 100) scale = 100;
    _scale = scale;
    [self updateUI];
}

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(IBAction)changedScale:(UIStepper *)stepper {
    self.scale = stepper.value; //this function works fine, but is not delegate/does not get called by view
}

-(float) scaleForGraph:(GraphView *)requestor {
    NSLog(@"HI"); //never gets here
}

-(NSMutableDictionary*) valuesForGraph:(GraphView *)requestor withWidth:(float) width {
    NSLog(@"Hello2"); //never gets here
    }
    return xyVals;
}

@end

Upvotes: 0

Views: 166

Answers (2)

cody
cody

Reputation: 3277

Make your controller actual delegate of GraphView. You can do it in interface builder by Ctrl-dragging from GraphView to the object (orange circle in the bottom) and than choose "delegate"

Upvotes: 1

veddermatic
veddermatic

Reputation: 1082

Nowhere in the code you've posted do you tell your GraphView that the GraphingViewController is it's delegate. So, you are sending a message to nil.

You'll want to do something like:

self.graphView.delegate = self;

In your GraphingViewController setup code.

Upvotes: 4

Related Questions