繁体   English   中英

使用协议和委托

[英]Using a protocol and a delegate

我试图使一些代码在视图中工作。 我已经声明了一个委托,并且没有实例化,知道我缺少什么吗? 我试图在下面总结一下我是如何做到的。 我认为问题出在某个地方,我的dataSource委托需要实例化。

我有一个称为图视图的视图和在视图控制器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;

同样在Graph View中,我尝试如下使用委托(像素是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结构objc_object * 0x0

编辑:(除了下面的@Clays答案)

原来,我与自定义视图的连接中断了。 这意味着故障在于View没有与Custom ViewController对话。 通过ctrl从“界面”构建器中的“视图控制器”按钮拖动到ViewController中的“视图”来建立链接。

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

换一种方式。

有问题的链接是插座。 这必须在ViewController中声明为属性,然后使用ctrl在IB中链接,从ViewController名称栏拖动到Controller中的View。

假设您已正确添加Outlet属性,则在执行ctrl拖动时,视图将显示一个选项。

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

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

插入电源插座后,名称会出现在菜单中,但不会变灰。

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

从跟踪看,您似乎还没有这样做; 否则您会在途中某处失去参考,因为在某些时候没有任何保留。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM