我可以在NSView子类中实现自定义目标操作吗?

时间:2012-11-29 20:16:36

标签: objective-c oop model-view-controller ibaction target-action

我目前有一个自定义视图类,它在窗口上绘制了一个2D游戏板表示。

当用户点击电路板时,我使用mouseDown:event来计算鼠标位置的单元坐标(我在自定义视图类中这样做)。

- (void)mouseDown:(NSEvent*)theEvent {

    // Get position of mouse click:
    NSPoint point = [theEvent locationInWindow];
    NSPoint mousePos = [self convertPoint:point fromView:nil];

    // Calculate which cell has been clicked:
    int cellX = mousePos.x / gridSize.width;
    int cellY = mousePos.y / gridSize.height;

}

(在上面的代码片段'gridSize'是一个NSPoint实例变量,我用它来存储游戏板中每个单元格的高度)

我是否可以在我的控制器类中创建可用于发送此信息的IBAction样式消息?

我想象的方式可行:

  • 在自定义视图中为单击的坐标声明实例变量。
  • 在控制器类中实现(IBAction):
  • 使用(id)发送方指针访问包含坐标的实例变量
  • 将IBAction链接到界面构建器
  • 中的自定义视图

为了尝试这个,我在自定义视图中将'cellX'和'cellY'声明为实例变量。然后我在我的控制器类中实现了以下内容:

-(IBAction)cellClicked:(id)sender { 

    [self setCellAtPosX:[sender cellX] PosY:[sender cellY];
}

(cellX和cellY是实例变量的访问器方法)

正如我所料,它不是那么简单,它不会让我将IBAction链接到自定义视图。我实施此方法的方法是否有任何遗漏?

我可以想象所有这些都需要某种通知器告诉接口构建器在哪里发送目标操作消息 - 在我的情况下,在mouseDown:实现的末尾,但是我找不到从哪里开始有这个!

1 个答案:

答案 0 :(得分:4)

使用委托模式实现此操作可能会遇到更少的麻烦,即在您的电路板视图上设置IBOutlet委托属性并让控制器实现此协议。在Interface Builder中,您将通过插座链接您的视图和控制器,视图将在mouseDown实现中调用它的委托方法,例如:

- (void)mouseDown:(NSEvent*)theEvent {
   ...
   [self.delegate boardView:self didSelectCellAtX:x Y:y];
}