編集可能な行を持つ NSTableView View-Based がありますが、ユーザーがセルの残りの部分ではなくテキストをクリックした場合にのみ編集を許可します。(画像参照)
テキストを表示するセルのゾーンだけでなく、セル全体を編集可能にする方法を誰かが知っていますか?
編集可能な行を持つ NSTableView View-Based がありますが、ユーザーがセルの残りの部分ではなくテキストをクリックした場合にのみ編集を許可します。(画像参照)
テキストを表示するセルのゾーンだけでなく、セル全体を編集可能にする方法を誰かが知っていますか?
私は何が起こっているのか理解していると信じています。
まず、テキストフィールドを実際に編集しているときに、フォーカスリングが表のセル全体を囲んでいることを確認できますか? 実際の現在のテキストの周りが狭いだけではありませんよね?
表のセル全体を囲んでいる場合は、テキスト フィールドがその内容を包み込むのではなく、表のセルを埋めるために制約がセルを引き延ばしていることを確認します。つまり、画像の「編集不可」の矢印が実際にテキスト フィールドの一部を指していることを確認しようとしています。私はそれを期待しています。
というわけで、問題はNSTableView
がクリックを管理する方法と、クリックされたビューをファーストレスポンダとして設定するかどうかです。Table View Programming Guide for Mac: Enable Row Selection and User Actions – Specifying How Subviews Should Respond to Eventsから、テーブル ビューが のオーバーライドで特別なロジックを実装していることがわかりますvalidateProposedFirstResponder(_:forEvent:)
。
のデフォルトの
NSTableView
実装でvalidateProposedFirstResponder:forEvent:
は、次のロジックが使用されます。
YES
のインスタンスまたはサブクラスでない限り、提案されたすべてのファーストレスポンダ ビューを返しますNSControl
。
NSControl
提案されたファーストレスポンダがインスタンスかサブクラスかを判断します。
コントロールが
NSButton
オブジェクトの場合は、 を返しYES
ます。コントロールが でない場合は
NSButton
、コントロールの を呼び出してhitTestForEvent:inRect:ofView:
、ヒット領域が追跡可能 (つまりNSCellHitTrackableArea
) であるか、編集可能なテキスト領域 (つまり )NSCellHitEditableTextArea
であるかを確認し、適切な値を返します。テキスト エリアがヒットした場合はNSTableView
、最初のレスポンダー アクションも遅延することに注意してください。
のカスタム サブクラスを実装しましたNSTextFieldCell
。これが行う唯一のことは、オーバーライドhitTestForEvent(_:inRect:ofView:)
して super を呼び出し、結果をログに記録し、それを返すことです。次に、セルにそのカスタム クラスを使用するように、テーブル セル ビューのテキスト フィールドを設定します。そのことから、テキスト フィールドの空の領域をクリックすると、 が表示されることを知りました.None
。実際のテキストをクリックすると、 が表示され.ContentArea | .EditableTextArea
ます。
最初の結果は、提案されたファーストレスポンダーを実際にファーストレスポンダーにすることをNSTableView
の の実装に許可しません。validateProposedFirstResponder(_:forEvent:)
後者の結果はそうです。
NSTextFieldCell
したがって、オーバーライドする独自のサブクラスを実装できますhitTestForEvent(_:inRect:ofView:)
。オーバーライドでは、super を呼び出します。結果が の場合は、返す前に に.None
変更します。.ContentArea | .EditableTextArea
次に、そのカスタム セル クラスをテーブルのテキスト フィールドに使用します。
NSTableView
または、その overridesのカスタム サブクラスを使用して、これに取り組むこともできますvalidateProposedFirstResponder(_:forEvent:)
。問題は、そのメソッドが応答するヒット テスト コードを除いて、そのメソッドのロジックを再実装するのが簡単ではないことです。