使用协议和委托

时间:2012-09-06 14:37:38

标签: objective-c model-view-controller xcode4 uiviewcontroller delegates

我正在尝试在视图中使用一些代码。我已经宣布了一个委托,它没有得到实例化,任何想法我缺少什么? 我试图总结一下我在下面的做法。我认为问题在于某处,我的dataSource委托需要实例化。

我有一个名为graph视图的视图和一个位于viewcontroller GraphViewController中的委托。

我知道GraphView中的方法正在做一些事情,因为它调用AxisDrawing助手类并绘制Axes。

以下是相关代码

在GraphView.h中,我设置了协议和dataSourceDelegate

@class GraphView;

@protocol GraphViewDataSourceDelegate
- (float)functionOfX:(float)xValue inGraphView:(GraphView *)sender;
@end

@interface GraphView : UIView

@property(nonatomic, weak) IBOutlet id <GraphViewDataSourceDelegate> dataSourceDelegate;

@end

我在GraphView.m中合成

#import "GraphView.h"
#import "AxesDrawer.h"

@implementation GraphView

@synthesize dataSourceDelegate = _dataSourceDelegate;

同样在图表视图中,我尝试使用委托如下(像素是CGPoint)。这个例程运行,我可以从这里绘制到GraphView,前提是我不尝试使用我的协议方法。即我绘制了一些DrawRect内容,它会检查UIView与我的自定义视图的链接

pixel.y = [self.dataSourceDelegate functionOfX:pixel.x inGraphView:self];

++++断点放在这里+++++

在GraphViewController中,我声明我实现了协议并按如下方式实现。编译器警告我并在执行完成时发现警告。 (我现在只返回3.0作为测试)。

@interface  

GraphViewController () <GraphViewDataSourceDelegate>
@property (nonatomic, weak) IBOutlet GraphView *graphView;

@end

...

-(float) functionOfX:(float)xValue inGraphView:(GraphView *)sender{
    NSLog(@"fofx accessed");
    return 3.0;
}

如果我在断点之后查看GraphView *对象,它似乎没有实例。我错过了什么。

这是来自断点处的痕迹

_dataSourceDelegate struct objc_object * 0x0

编辑:(除@Clays以下答案)

事实证明,我与自定义视图的连接已中断。这意味着错误在于View不与Custom ViewController交谈。链接是通过从“界面”构建器中的“视图控制器”按钮拖动到ViewController中的“视图”来实现的。

这导致ViewController被实例化,然后一切正常。

换句话说。

有问题的链接是Outlet。这必须在ViewController中作为属性声明,然后使用ctrl在IB中链接从ViewController Name-Bar拖动到Controller中的View。

如果您正确添加了Outlet属性,当您执行ctrl拖动时,您的视图将显示一个选项。

IB中ViewController按钮的上下文按钮弹出信息确实提供了线索。

如果您忽略了将outlet属性放入视图控制器,则链接确实会出现在上下文按钮弹出窗口中,但它显示为灰色,当您执行链接时,您的视图未命名。

将插座插入后,名称会显示在菜单中,但不会显示为灰色。

1 个答案:

答案 0 :(得分:1)

确保您已正确连接所有内容:设置GraphView的dataSourceDelegate和GraphViewController的graphView。

从痕迹看起来你没有那样做;或者你在某个地方失去了参考,因为在某些时候没有任何东西可以保留它。