1

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

当用户单击板上时,我使用 mouseDown: 事件从鼠标位置计算单元格坐标(我在自定义视图类中执行此操作)。

- (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)sender 指针访问保存坐标的实例变量
  • 将 IBAction 链接到界面生成器中的自定义视图

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

-(IBAction)cellClicked:(id)sender { 

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

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

正如我所期望的那样,它并不是那么简单,它不会让我将 IBAction 链接到自定义视图。我的实现方法有什么遗漏吗?

我可以想象,所有这一切都需要某种通知器,它告诉接口构建器在哪里发送目标操作消息——在我的例子中,在 mouseDown: 实现的末尾,但我找不到从哪里开始!

4

1 回答 1

4

使用委托模式实现这一点可能会更轻松,即在您的板视图上设置一个 IBOutlet 委托属性并让控制器实现此协议。在 Interface Builder 中,您将通过插座链接您的视图和控制器,并且视图将在 mouseDown 实现中调用它的委托方法,例如:

- (void)mouseDown:(NSEvent*)theEvent {
   ...
   [self.delegate boardView:self didSelectCellAtX:x Y:y];
}
于 2012-11-29T20:25:39.730 回答