2012-03-26 13 views
1

Insbesondere möchte ich eine NSTokenField ignorieren Mausereignisse machen, weil ich es in einem NSTableCellView nur zum Anzeigen von Daten in einer Tokenized-Weise ohne Bearbeitung zu verwenden .So machen Sie ein NSControl (zB NSTokenField) ignorieren Mausereignisse

Das Setzen des Tokenfelds enabled = NO funktioniert, außer dass es die Tokens ausgraut und es schwierig macht, den Text zu lesen.

editable = NOeditable = NO Einstellung ist ziemlich nah an dem, was ich will-es verhindert Bearbeitung unter Beibehaltung der Token-Feld-Look-außer, wenn ich die Maus über die Token, sie leuchten. Wenn ich das nur verhindern könnte, wäre ich im Geschäft.

Ich vermute, ich muss etwas Unterklasse und überschreiben einige NSResponder Methoden, aber nicht ganz sicher, was zu tun ist. Ich habe versucht, Unterklasse NSTokenField und überschreiben mouseEntered: und mouseMoved: nichts zu tun, aber das hat auch nicht funktioniert.

+0

Das Feld verwendet wahrscheinlich einen [Tracking-Bereich] (http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSTrackingArea_class/Reference/Reference.html), um diese Mauseingabe/-ausgabe zu erhalten Veranstaltungen. Nicht sicher, warum überschreiben 'mousEntered:' vermasselt Zeichnung, aber Sie könnten '[field setTrackingArea: nil]' auf einem nicht-Unterklasse-Feld versuchen und sehen, was passiert. –

+0

Vielen Dank für das Zeigen, dass, wenn ich die Klasse erstellt habe, 'drawRect:' überschrieben wurde, so dass es nichts getan hat. Ich habe versucht '' (NSTrackingArea * trackingArea in [TokenField trackingAreas]) { [TokenField removeTrackingArea: trackingArea]; } ', aber keine Würfel. Außerdem versuchte ich 'mouseMoved:' zusätzlich zu 'mouseEntered:', aber das hat auch nicht funktioniert ... – yuji

+0

@yuji: Ich habe meine Maschine im Moment nicht zum testen, also bin ich raus Ideen. Vielleicht möchten Sie nur einen eigenen Ersatz für diese Klasse schreiben. Betrachten Sie 'BWToolkit' als Beispiel. –

Antwort

2

Nachdem ich viele Sachen ausprobiert habe, habe ich es endlich auf Basis von Iulius Cæsars Vorschlag arbeiten lassen.

Der Trick war NSTextField Unterklasse und überschreibt trackingAreas:

- (NSArray *)trackingAreas 
{ 
    return [NSArray array]; 
} 

einfach Löschen des Tracking-Bereiche Feld beim Erstellen es nicht genug war, da das Feld in einer Scroll-Ansicht war und manchmal würden die Tracking-Bereiche neu erstellt werden.

+0

Froh, dass mein Vorschlag hilfreich war! Ich war mir nicht ganz sicher, ob es der richtige Weg war. –