mouseover-Erkennung in NSCell von NSTableView?

8

Ich möchte die Texthintergrundfarbe in der Zelle einer Tabellenansicht ändern, wenn sie verschoben wird, ähnlich wie AddressBook die Beschriftung des Elements eines Kontakts "hervorhebt", wenn Sie die Beschriftungsnamen überlappen. Jedoch kann ich nicht herausfinden, wie man es schafft ...

Erkennung eines Mouseover auf einem bestimmten NSCell und ... Nach dem Erkennen der Zelle, auf der er schwebte, markieren Sie den Text in dieser Zelle (nicht die gesamte Zeile, als ob der Benutzer diese Zeile ausgewählt hätte)

Da NSCell keine Unterklasse von NSView ist, scheint dies eine sehr schwierige Aufgabe zu sein.

Jedes Beispiel oder eine Erklärung dazu wäre sehr zu begrüßen.

Danke!

    
Patrick 07.05.2010, 06:53
quelle

3 Antworten

10

Ich habe es tatsächlich mit einer anderen Methode funktioniert. Ich habe es aus dem hier veröffentlichten Beispiel ... Ссылка Ссылка

Anstatt den Tracking-Mechanismus von NSCell zu verwenden, verfolge ich mouseEntered / mouseExited und mouseMoved innerhalb meiner untergeordneten NSTableView.

  1. Wenn die tableview watchFromNib-Methode aufgerufen wird, erstelle ich einen TrackingRect aus dem sichtbaren Teil der Tabellenansicht

  2. Ich habe einen BOOL-Ivar, der auf YES gesetzt ist, wenn sich die Maus im Tracking-Bereich befindet (mouseEntered), und NO, wenn dies nicht der Fall ist (mouseExited)

  3. Innerhalb der mouseMoved-Methode ermittle ich die aktuelle Zeile, in der sich der Mauszeiger befindet, und setze sie auf einen NSInteger-Ivar und rufe dann den setNeedsDisplayInRect der Tableview auf: Übergeben des Rect der Zeile, in der sich die Maus befindet.

  4. Ich überschreibe auch resetCursorRects, um das alte Tracking-Rect zu entfernen und ein neues zu addieren ... Diese Methode wird aufgerufen, wenn die Tabelle durchgescrollt wird, so dass sie das letzte sichtbare Rect verfolgt.

  5. Schließlich ermittele ich in meinem TableView-Delegaten die ausgewählte Zeile (indem ich den Zeilenindex aus dem NSInteger-Ivar der Tabellenansicht abrufe und die Textfarbe der Zelle (oder was auch immer Sie wollen) ändert, wenn die aktuell gezeichnete Zelle übereinstimmt Zeile der Mauszeiger ist eingeschaltet All dies erfolgt in der Delegate-Methode: TableView: (NSTableView *) aTableView WillDisplayCell: (ID) aCell forTableColumn: (NSTableColumn *) aTableColumn Zeile: (NSInteger) rowIndex

Ich hoffe, das hilft anderen, da dies ein bisschen schwierig war. Es ist auch wichtig, sicherzustellen, dass tableview der ersteResponder ist, wenn die Ansicht geladen wird, was die Dinge ein wenig gestrafft und sauberer macht.

Übrigens, gibt es eine Möglichkeit, eine bestimmte Kontrolle in einer Ansicht immer die erste Antwort zu sein, mit nichts anderem als der erste Antwort möglich? Sogar eine Methode wie die iPhones ... viewWillAppear Methode hilft, da ich den ersten Responder jedes Mal einstellen konnte, wenn die Ansicht sichtbar ist ... aber ich bin mir einer solchen Methode auf dem Mac nicht bewusst.

    
Patrick 08.05.2010, 17:56
quelle
3

Insgesamt ist es keine einfache Aufgabe, wie Sie bemerkt haben.

Um die Maus in einem NSCell zu verfolgen, erstellen Sie NSCell und überschreiben

%Vor%

und

%Vor%

Sobald Sie festgestellt haben, dass die Maus innerhalb einer Zelle sucht, können Sie mit [tableView rowAtPoint:point ] und [tableView columnAtPoint:point] herausfinden, in welcher Zelle Sie sich befinden, und dann Ihren Rahmen mit [tableView frameOfCellAtColumn:column row:row] finden. Dann können Sie die Art ändern, in der Ihre Zelle gezeichnet wird, indem Sie eine Eigenschaft der Zelle ändern oder die Art ändern, in der sie gezeichnet wird, indem Sie drawInteriorWithFrame:inView: überschreiben.

Hier ist die Dokumentation zum Unterrichten von NSCell: Ссылка

    
Ken Aspeslagh 07.05.2010 13:22
quelle
0

Ich habe etwas Ähnliches erreicht, indem ich addGlobalMonitorForEventsMatchingMask: handler: von NSEvent in meiner NSTableView-Unterklasse für NSMouseMovedMask verwendet habe. Mit diesem zusammen mit columnAtPoint und rowAtPoint von NSTableView konnte ich herausfinden, ob sich die Maus innerhalb einer bestimmten Zelle befand.

Mit diesen Informationen konnte ich einen PopOver aufrufen, wenn sich die Maus über einer bestimmten Zelle befand.

    
sandeep593 13.02.2015 17:11
quelle

Tags und Links