2009-06-25 9 views
1

J'ai un plateau de jeu avec 25 tuiles de myGameTile, une sous-classe de NSView. Dans mouseDown: Je veux déterminer sur quelle case j'ai cliqué et définir un ivar sur une valeur représentative.Détermination de l'instance de NSView qui a initié un mouseDown:

par exemple. Si je clique sur le pavé 12, définissez clickedTile sur "12" ou une valeur représentant uniquement cette occurrence particulière.

Je suis ouvert n'importe quoi de la valeur entière 12 à une sorte d'introspection/réflexion, bien que les dispositifs intégrés et l'élégance soient préférables aux hacks, aux wrappers d'exécution, et à la modification. Pourtant, je suis conscient que je n'ai peut-être pas d'autre choix que de me fier à ces solutions, alors n'hésitez pas à répondre à ces questions. J'aimerais connaître toutes mes options. Merci!

+0

Cette question est mal intitulée. Je suggère de le changer pour quelque chose comme "Déterminer quelle sous-vue dans un plateau a été cliquée". Poser la question "quel est l'instance" n'a pas de sens à première vue. –

Répondre

5

Vous pouvez sous-classer NSView et remplacer le tag method, comme indiqué dans la documentation.

+0

Il a déjà dit qu'il avait sous-classé NSView ... Cela dit, mettre le tag est probablement un moyen très simple de savoir quelle vue a été cliquée. Cela nécessiterait d'assigner manuellement une étiquette à chaque vue dans l'ordre désiré, mais cela semble être une solution très pratique. +1 –

0

Je pense que hitTest: fera ce que vous voulez. Quelque chose comme ceci:

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

NSView hérite de NSResponder, donc vous ne devriez probablement pas avoir à tester manuellement ceci - la documentation de -hitTest: dit "Cette méthode est utilisée principalement par un objet NSWindow pour déterminer quelle vue devrait recevoir un événement de souris. Il est rare que vous ayez besoin d'invoquer cette méthode, mais vous voudrez peut-être la surcharger pour qu'un objet de vue cache les événements de souris à partir de ses sous-vues. " Si la méthode -mouseDown: est appelée sur un NSView, cela signifie que la vue a été déterminée comme celle devant répondre à l'événement. –

1

Vous avez plusieurs possibilités:

Si vous manipulez la mouseDown dans la vue de tuile, vous devez mapper auto à l'ID de tuiles. Il existe trois manières simples de procéder:

  • Avant de configurer Tile.tag comme ID de tuile, utilisez self.tag.
  • Recherche de carreaux dans le tableau de tuiles pour trouver l'index [parent.tiles IndexOfObject: auto]
  • Créer un mappage de dictionnaire carreaux ou tuiles ID [[parent.tiles objectForKey: auto] intValue]

De toute évidence, l'utilisation de la balise est la plus simple, tant que vous n'utilisez pas l'étiquette pour autre chose. Vous pouvez également implémenter hitTest sur la vue parente et renvoyer la vue parent, puis gérer le mouseDown dans la vue parente. Ensuite, mouseDown saura où se trouve le hit et par conséquent de quelle case il s'agit.

Questions connexes