2009-06-25 4 views
1

Ich habe ein Spielbrett mit 25 Kacheln von myGameTile, einer Unterklasse von NSView. In mouseDown: Ich möchte feststellen, auf welche Kachel ich geklickt habe und einen ivar auf einen repräsentativen Wert setzen.Ermitteln, welche NSView-Instanz einen mouseDown initialisiert:

z.B. Wenn ich auf Kachel 12 klicke, setze clickedTile auf "12" oder einen Wert, der diese bestimmte Instanz eindeutig repräsentiert.

Ich öffne alles von der Ganzzahl Wert 12 bis hin zu einer Art Introspektion/Reflexion, obwohl integrierte Funktionen und Eleganz Hacks, Laufzeit-Wrapper und Modifikation vorzuziehen sind. Dennoch bin ich mir bewusst, dass ich keine andere Wahl habe, als mich auf diese Lösungen zu verlassen, also bitte auch mit denen. Ich würde gerne alle meine Möglichkeiten kennen. Vielen Dank!

+0

Dies ist eine schlecht betitelte Frage. Ich würde vorschlagen, es zu etwas wie "Bestimmen, welche Unteransicht in einem Spielbrett wurde angeklickt" zu ändern. Die Frage "welches Instanz-Selbst ist" macht auf den ersten Blick wenig Sinn. –

Antwort

5

Sie könnten NSView ableiten und die tag method überschreiben, wie in der Dokumentation geschrieben.

+0

Er hat bereits gesagt, dass er NSView subclassiert hat ... Das heißt, das Setzen des Tags ist wahrscheinlich eine sehr einfache Möglichkeit zu wissen, auf welche Ansicht geklickt wurde. Es müsste manuell jeder Ansicht ein Tag in der gewünschten Reihenfolge zugewiesen werden, aber dies erscheint als eine sehr praktikable Lösung. +1 –

0

Ich denke hitTest: wird tun, was Sie wollen. Etwas wie folgt aus:

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

NSView erbt von NSResponder, also sollten Sie dies wahrscheinlich nicht manuell testen müssen - die Dokumentation für -hitTest: sagt "Diese Methode wird hauptsächlich von einem NSWindow-Objekt verwendet, um festzustellen, welche Ansicht ein Mouse-Down-Ereignis erhalten soll msgstr "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" Diese Methode sollte selten aufgerufen werden, aber Sie möchten sie möglicherweise überschreiben, damit ein Ansichtsobjekt Mauszeiger-Ereignisse aus seinen Unteransichten ausblenden kann Wenn die Methode -mouseDown: in einem NSView aufgerufen wird, bedeutet dies, dass die Ansicht als diejenige festgelegt wurde, die auf das Ereignis reagieren soll. –

1

Sie haben mehrere Möglichkeiten:

Wenn Sie die mouseDown- in der Tile-Ansicht behandeln, dann müssen Sie sich selbst auf die Fliese ID abzubilden. Dazu gibt es drei einfache Möglichkeiten:

  • Konfigurieren Sie Tile.tag als Kachel-ID, und verwenden Sie dann self.tag.
  • Suche nach Fliesen in der Anordnung von Fliesen, den Index zu finden [parent.tiles IndexOfObject: self]
  • eine ID-Fliese oder Kachel Wörterbuch-Mapping erstellen [[parent.tiles objectForKey: self] intValue]

Die Verwendung des Tags ist am einfachsten, solange Sie das Tag nicht für andere Zwecke verwenden.

Alternativ können Sie hitTest für die übergeordnete Ansicht implementieren, die übergeordnete Ansicht zurückgeben und dann mouseDown in der übergeordneten Ansicht behandeln. Dann wird mouseDown wissen, wo der Treffer ist und somit welche Kachel es ist.