几天来我一直在为此苦苦挣扎——我有一个自定义协议,它应该从我的一个模型(通过它的控制器)获取数据到绘制它的视图。
这是我的做法 - 一步一步:
在图形视图中,我声明协议如下:
@class GraphView;
@protocol GraphViewDataSource <NSObject>
-(CGFloat)yValueForGraphView:(GraphView *)sender usingXval:(CGFloat)xVal;
@end
然后我在 view.h 中声明一个属性
@interface GraphView : UIView
@property (nonatomic, weak) IBOutlet id <GraphViewDataSource> dataSource;
@end
我在 view.m 中综合了属性:
@synthesize dataSource=_dataSource;
然后在我的drawRect中,我调用这个方法从另一个控制器的模型中带回一个CGFloat:
-(void) drawRect:(CGRect)rect
{
//context stuff, setting line width, etc
CGPoint startPoint=CGPointMake(5.0, 6.0);
NSLog(@"first, y value is: %f", startPoint.y);
startPoint.y=[self.dataSource yValueForGraphView:self usingXval:startPoint.x]; //accessing delegate via property
NSLog(@"now the y value now is: %f", startPoint.y);
//other code..
}
现在在我的另一个视图控制器中,我正在导入 view.h 文件并声明它符合协议:
#import "GraphView.h"
@interface CalculatorViewController () <GraphViewDataSource>
为 GraphView 创建一个属性:
@property (nonatomic, strong) GraphView *theGraphView;
合成:
@synthesize theGraphView=_theGraphView;
现在在设置器中,我将当前控制器设置为数据源(也称为委托):
-(void) setTheGraphView:(GraphView *)theGraphView
{
_theGraphView=theGraphView;
self.theGraphView.dataSource=self;
}
我还将控制器设置为 prepareForSegue 中的委托(我在寻找修复程序时尝试过的事情之一):
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"GraphViewController"])
{
self.theGraphView.dataSource=self;
}
}
最后,我实现了所需的方法:
-(CGFloat)yValueForGraphView:(GraphView *)sender usingXval:(CGFloat)xVal
{
CGFloat test=51.40; //just to test
return test;
}
我在graphView的drawRect中从我的测试NSLog得到的输出是:
2012-10-25 20:56:36.352 ..[2494:c07] first, y value is: 6.000000
2012-10-25 20:56:36.354 ..[2494:c07] now the y value now is: 0.000000
这应该通过数据源返回 51.40,但事实并非如此。我不知道为什么!让我发疯,似乎我做的一切都是正确的。但是委托方法没有被调用。
我错过了什么愚蠢的事情吗?
附加信息 - 控制器和 GraphView 图表: