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:
Return YES
für alle Ersthelfer vorgeschlagen Ansichten, sofern sie keine Instanzen oder Unterklassen von NSControl
sind.
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.
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? –
Danke für die Antwort, editierte ich die Frage mit einem Bild, das die Hierarchie der Zelle zeigt –