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!
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.
Wenn die tableview watchFromNib-Methode aufgerufen wird, erstelle ich einen TrackingRect aus dem sichtbaren Teil der Tabellenansicht
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)
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.
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.
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.
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: Ссылка
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.
Tags und Links objective-c macos cocoa