Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 确定哪个NSView实例启动了鼠标向下移动:_Objective C_Cocoa_Reflection_Nsview_Introspection - Fatal编程技术网

Objective c 确定哪个NSView实例启动了鼠标向下移动:

Objective c 确定哪个NSView实例启动了鼠标向下移动:,objective-c,cocoa,reflection,nsview,introspection,Objective C,Cocoa,Reflection,Nsview,Introspection,我有一个游戏板,有25个myGameTile的分片,myGameTile是NSView的一个子类。 在mouseDown中:我想确定我单击了哪个磁贴,并将ivar设置为代表性值 e、 g.如果我单击tile 12,则将ClickedFile设置为12或某个唯一表示该特定实例的值 从整数值12到某种内省/反射,我都可以打开任何东西,尽管内置功能和优雅比黑客、运行时包装和修改更可取。尽管如此,我知道我可能别无选择,只能依靠这些解决方案,所以也请用这些解决方案来回答。我想知道我所有的选择。谢谢 您可以

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

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


从整数值12到某种内省/反射,我都可以打开任何东西,尽管内置功能和优雅比黑客、运行时包装和修改更可取。尽管如此,我知道我可能别无选择,只能依靠这些解决方案,所以也请用这些解决方案来回答。我想知道我所有的选择。谢谢

您可以按照文档中的说明对NSView进行子类化并覆盖。

您可以按照文档中的说明对NSView进行子类化并覆盖。

我认为hitTest:可以满足您的要求。大概是这样的:

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

我认为hitTest:会做你想做的事。大概是这样的:

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

您有几种可能性:

如果在平铺视图中处理鼠标向下,则需要将self映射到平铺ID。有三种简单的方法:

将Tile.tag预先配置为Tile ID,然后使用self.tag。 在平铺数组中搜索平铺以查找索引[parent.Tiles indexOfObject:self] 创建字典映射磁贴或磁贴ID[[parent.tiles objectForKey:self]intValue] 显然,使用标签是最简单的,只要您没有将标签用于其他任何事情


或者,您可以在父视图上实现hitTest,并返回父视图,然后在父视图中处理鼠标向下移动。然后,mouseDown将知道命中的位置,从而知道它是哪个磁贴。

您有几种可能性:

如果在平铺视图中处理鼠标向下,则需要将self映射到平铺ID。有三种简单的方法:

将Tile.tag预先配置为Tile ID,然后使用self.tag。 在平铺数组中搜索平铺以查找索引[parent.Tiles indexOfObject:self] 创建字典映射磁贴或磁贴ID[[parent.tiles objectForKey:self]intValue] 显然,使用标签是最简单的,只要您没有将标签用于其他任何事情


或者,您可以在父视图上实现hitTest,并返回父视图,然后在父视图中处理鼠标向下移动。然后,mouseDown将知道命中的位置,从而知道它是哪个磁贴。

这是一个标题不好的问题。我建议将其更改为类似于确定在游戏板中单击了哪个子视图。乍一看,询问self是哪一个实例没有什么意义。这是一个标题不好的问题。我建议将其更改为类似于确定在游戏板中单击了哪个子视图。乍一看,询问self是哪一个实例毫无意义。他已经说过他已经将NSView子类化了。。。也就是说,设置标签可能是一种非常简单的方法,可以知道单击了哪个视图。这需要按照所需的顺序手动为每个视图分配一个标记,但这似乎是一个非常可行的解决方案+1他已经说过他已将NSView子类化。。。也就是说,设置标签可能是一种非常简单的方法,可以知道单击了哪个视图。这需要按照所需的顺序手动为每个视图分配一个标记,但这似乎是一个非常可行的解决方案+1NSView继承自NSResponder,因此您可能不必手动测试此方法,-hitTest:的文档说明此方法主要由NSWindow对象用于确定哪个视图应接收鼠标按下事件。您几乎不需要调用此方法,但您可能希望覆盖它,使视图对象从其子视图中隐藏鼠标按下事件。如果对NSView调用了-mouseDown:方法,则表示该视图被确定为应响应事件的视图。NSView继承自NSResponder,因此,您可能不必手动测试此方法,-hitTest:的文档说明此方法主要由NSWindow对象用于确定哪个视图应接收鼠标按下事件。您几乎不需要调用此方法,但您可能希望覆盖它,使视图对象从其子视图中隐藏鼠标按下事件。如果对NSView调用-mouseDown:方法,则表示该视图被确定为应该响应事件的视图。