2016-03-20 26 views
1

Ich habe eine NSTableView View-Based, die editierbare Zeilen haben, aber nur die Edition, wenn der Benutzer auf den Text, nicht auf den Rest der Zelle klickt. (Siehe das Bild)NSTableView, so dass es benutzerfreundliche

Weiß jemand, wie kann ich die gesamte Zelle bearbeitbar machen, nicht nur die Zone der Zelle, die Text anzeigt?

TableView

The cell

+0

Verwenden Sie ein nacktes 'NSTextField' ** als ** die Zellenansicht? Oder ist die Zellenansicht eine Containeransicht wie "NSTableCellView" und das Textfeld ist eine Unteransicht davon? Wenn Letzteres, welche Beschränkungen haben Sie zwischen dem Textfeld und seinem Container eingerichtet? –

+0

Danke für die Antwort, editierte ich die Frage mit einem Bild, das die Hierarchie der Zelle zeigt –

Antwort

1

Ich glaube, ich verstehe, was los ist.

Erstens, können Sie bestätigen, dass, wenn das Textfeld tatsächlich bearbeitet wird, der Fokusring die gesamte Tabellenzelle umfasst? Es ist nicht nur eng um den aktuellen Text, richtig?

Wenn es die gesamte Tabellenzelle umfasst, bestätigt das, dass die Einschränkungen es dehnen, um die Tabellenzelle zu füllen, anstatt das Textfeld, das seinen Inhalt umarmt. Mit anderen Worten, ich versuche zu bestätigen, dass der Pfeil "Nicht editierbar" in Ihrem Bild tatsächlich auf einen Teil des Textfelds zeigt. Ich erwarte es.

Also, mit dem aus dem Weg, ist das Problem, wie NSTableView Klicks verwaltet und ob sie die angeklickte Ansicht als Ersthelfer festlegen oder nicht. Von Table View Programming Guide for Mac: Enabling Row Selection and User Actions – Specifying How Subviews Should Respond to Events erfahren wir, dass die Tabellenansicht in einer Überschreibung von validateProposedFirstResponder(_:forEvent:) spezielle Logik implementiert:

Der Standard NSTableView Implementierung von validateProposedFirstResponder:forEvent: verwendet die folgende Logik:

  1. Return YES für alle Ersthelfer vorgeschlagen Ansichten, sofern sie keine Instanzen oder Unterklassen von NSControl sind.

  2. Bestimmen Sie, ob der vorgeschlagene Ersthelfer eine NSControl Instanz oder Unterklasse ist.

    • Wenn die Steuerung ein NSButton Objekt, das Rück YES.

    • Wenn die Steuerung nicht ein NSButton ist, die hitTestForEvent:inRect:ofView: Kontrolle rufen, um zu sehen, ob die Trefferfläche aufspürbar ist (das heißt, NSCellHitTrackableArea) oder ein editierbares Text Bereich (das heißt, NSCellHitEditableTextArea) und schicken Sie die entsprechende Wert. Beachten Sie, dass NSTableView auch die First Response Aktion verzögert, wenn ein Textbereich erreicht wird.

Ich habe eine benutzerdefinierte Unterklasse von NSTextFieldCell implementiert. Das einzige, was es tut, ist, hitTestForEvent(_:inRect:ofView:) außer Kraft zu setzen, um zu super durchzugehen, das Ergebnis zu protokollieren und es zurückzugeben. Ich setze dann das Textfeld in einer Tabellenzellenansicht, um diese benutzerdefinierte Klasse für seine Zelle zu verwenden. Daraus habe ich gelernt, dass das Klicken in den leeren Bereich des Textfelds .None ergibt. Wenn Sie auf den tatsächlichen Text klicken, wird .ContentArea | .EditableTextArea angezeigt.

Das erste Ergebnis führt nicht zur NSTableView Implementierung von validateProposedFirstResponder(_:forEvent:), damit der vorgeschlagene Ersthelfer tatsächlich zum Ersthelfer gemacht werden kann. Letzteres Ergebnis tut.

Sie könnten also Ihre eigene Unterklasse von NSTextFieldCell implementieren, die hitTestForEvent(_:inRect:ofView:) überschreibt. In Ihrer Überschreibung würden Sie zu Super aufrufen. Wenn das Ergebnis .None lautet, ändern Sie es in .ContentArea | .EditableTextArea, bevor Sie es zurücksenden. Verwenden Sie dann diese benutzerdefinierte Zellklasse für die Textfelder in Ihrer Tabelle.

Alternativ können Sie versuchen, dies zu beheben, indem Sie eine benutzerdefinierte Unterklasse von NSTableView verwenden, die validateProposedFirstResponder(_:forEvent:) überschreibt. Das Problem ist, dass es nicht einfach ist, die Logik dieser Methode neu zu implementieren, außer auf welche Treffer-Test-Codes sie reagiert.

+0

Unglaubliche Antwort Ken, danke! –

Verwandte Themen