我有一个带有 25 块 myGameTile 的游戏板,这是 NSView 的一个子类。在 mouseDown 中:我想确定我单击了哪个图块并将 ivar 设置为代表值。
例如,如果我单击图块 12,请将 clickedTile 设置为“12”或唯一代表该特定实例的某个值。
我打开了从整数值 12 一直到某种内省/反思的任何东西,尽管内置功能和优雅比 hack、运行时包装器和修改更可取。不过,我知道我可能别无选择,只能依赖这些解决方案,所以也请回答这些问题。我想知道我所有的选择。谢谢!
我有一个带有 25 块 myGameTile 的游戏板,这是 NSView 的一个子类。在 mouseDown 中:我想确定我单击了哪个图块并将 ivar 设置为代表值。
例如,如果我单击图块 12,请将 clickedTile 设置为“12”或唯一代表该特定实例的某个值。
我打开了从整数值 12 一直到某种内省/反思的任何东西,尽管内置功能和优雅比 hack、运行时包装器和修改更可取。不过,我知道我可能别无选择,只能依赖这些解决方案,所以也请回答这些问题。我想知道我所有的选择。谢谢!
您可以继承 NSView 并覆盖标记方法,如文档中所述。
你有几种可能性:
如果您在 Tile 视图中处理 mouseDown,则需要将 self 映射到 tile ID。有三种简单的方法可以做到这一点:
显然,使用标签是最简单的,只要您不将标签用于其他任何事情。
或者,您可以在父视图上实现 hitTest,并返回父视图,然后在父视图中处理 mouseDown。然后 mouseDown 将知道命中在哪里,从而知道它是哪个图块。
我认为 hitTest: 会做你想做的事。像这样的东西:
- (void)mouseDown:(NSEvent *)theEvent {
NSPoint aPoint = [theEvent locationInWindow];
NSView* viewHit = [self hitTest:aPoint];
if( viewHit != nil && viewHit != self ) {
// viewHit is our tile.
}
}