1

我有一个带有 25 块 myGameTile 的游戏板,这是 NSView 的一个子类。在 mouseDown 中:我想确定我单击了哪个图块并将 ivar 设置为代表值。

例如,如果我单击图块 12,请将 clickedTile 设置为“12”或唯一代表该特定实例的某个值。

我打开了从整数值 12 一直到某种内省/反思的任何东西,尽管内置功能和优雅比 hack、运行时包装器和修改更可取。不过,我知道我可能别无选择,只能依赖这些解决方案,所以也请回答这些问题。我想知道我所有的选择。谢谢!

4

3 回答 3

5

您可以继承 NSView 并覆盖标记方法,如文档中所述。

于 2009-06-25T17:13:22.997 回答
1

你有几种可能性:

如果您在 Tile 视图中处理 mouseDown,则需要将 self 映射到 tile ID。有三种简单的方法可以做到这一点:

  • 预先配置 Tile.tag 为 tile ID,然后使用 self.tag。
  • 在 Tiles 数组中搜索 Tile 找到索引 [parent.tiles indexOfObject:self]
  • 创建字典映射 Tile 或 tile ID [[parent.tiles objectForKey:self] intValue]

显然,使用标签是最简单的,只要您不将标签用于其他任何事情。

或者,您可以在父视图上实现 hitTest,并返回父视图,然后在父视图中处理 mouseDown。然后 mouseDown 将知道命中在哪里,从而知道它是哪个图块。

于 2009-06-26T02:26:18.500 回答
0

我认为 hitTest: 会做你想做的事。像这样的东西:

- (void)mouseDown:(NSEvent *)theEvent {
    NSPoint aPoint = [theEvent locationInWindow];
    NSView* viewHit = [self hitTest:aPoint];
    if( viewHit != nil && viewHit != self ) {
        // viewHit is our tile.
    }
}
于 2009-06-25T17:54:28.887 回答