【问题标题】:Can I implement a custom target-action in a NSView subclass?我可以在 NSView 子类中实现自定义目标操作吗?
【发布时间】:2012-11-18 00:14:30
【问题描述】:

我目前有一个自定义视图类,它在窗口上绘制 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;

}

(在上面的 sn-p 'gridSize' 是一个 NSPoint 实例变量,我用它来存储游戏板中每个单元格的高度和宽度)

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

我想象这可以工作的方式是:

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

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

-(IBAction)cellClicked:(id)sender { 

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 看起来我需要对这个做一点阅读......我还没有真正理解委托模式,直到遇到真正需要它现在我想(或者我一直在避免它并寻找其他方法)。
    • 稍微阅读后,我可以看出这显然是正确的处理方式!感谢您指出这一点,我对面向对象编程很陌生,这是我第一次在自己的编程中遇到需要我使用这种方法的东西,所以我没有想到!
    • 没问题,很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多