Протокол и делегат между представлением и контроллером - PullRequest
0 голосов
/ 18 сентября 2011

У меня возникли проблемы с настройкой метода протокола / делегата между моделью (GraphView) и контроллером (GraphViewController).NSLog в drawRect: в GraphView.m сообщает мне, что выражение равно null

переменная выражение содержитзначение (NSLog в ViewDidLoad доказывает это).Я что-то упускаю из виду?

GraphView.h

@class GraphView;

@protocol GraphViewDelegate
-(NSString *) expressionForGraphView:(GraphView *) requestor; 
@end

@interface GraphView : UIView
{
      id <GraphViewDelegate> delegate;
}

@property (assign) id <GraphViewDelegate> delegate;

@end

GraphView.m

#import "GraphView.h"

@implementation GraphView

@synthesize delegate;

- (void)drawRect:(CGRect)rect
{
      NSString *expression = [self.delegate expressionForGraphView:self];
      NSLog(@"%@", expression);

}

GraphViewController.h

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

@interface GraphViewController : UIViewController <GraphViewDelegate>
{
    GraphView *graphView;
    NSString *expression;
}

@property (retain) IBOutlet GraphView *graphView;
@property (retain) NSString *expression;

@end

GraphViewController.m

#import "GraphViewController.h"

@implementation GraphViewController

@synthesize graphView;
@synthesize expression;

-(NSString *) expressionForGraphView:(GraphView *) requestor
{
      NSString *tempString;
      if (requestor == self.graphView)
        tempString = self.expression;
      else 
        tempString = nil;

      return tempString;
}

- (void)viewDidLoad
{
     [super viewDidLoad];
     self.graphView.delegate = self;
     NSLog(@"%@", self.expression);
}

1 Ответ

0 голосов
/ 18 сентября 2011

Подсказка в названии метода

- (void)viewDidLoad

Представление уже загружено до того, как вы установите делегата. Поэтому, когда drawRect был вызван, делегат был nil.

Настройка делегата в соответствующем методе инициализатора или в IB

...