确定哪个NSView实例启动了mouseDown:

时间:2009-06-25 17:07:50

标签: objective-c cocoa reflection nsview introspection

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

e.g。如果我单击tile 12,则将clickedTile设置为“12”或某个唯一表示该特定实例的值。

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

3 个答案:

答案 0 :(得分:5)

您可以继承NSView并覆盖tag method,如文档中所述。

答案 1 :(得分:1)

您有几种可能性:

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

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

显然,只要你没有将标签用于其他任何东西,使用标签是最简单的。

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

答案 2 :(得分:0)

我认为hitTest:会做你想要的。像这样:

- (void)mouseDown:(NSEvent *)theEvent {
    NSPoint aPoint = [theEvent locationInWindow];
    NSView* viewHit = [self hitTest:aPoint];
    if( viewHit != nil && viewHit != self ) {
        // viewHit is our tile.
    }
}