1

編集可能な行を持つ NSTableView View-Based がありますが、ユーザーがセルの残りの部分ではなくテキストをクリックした場合にのみ編集を許可します。(画像参照)

テキストを表示するセルのゾーンだけでなく、セル全体を編集可能にする方法を誰かが知っていますか?

テーブルビュー

セル

4

1 に答える 1

1

私は何が起こっているのか理解していると信じています。

まず、テキストフィールドを実際に編集しているときに、フォーカスリングが表のセル全体を囲んでいることを確認できますか? 実際の現在のテキストの周りが狭いだけではありませんよね?

表のセル全体を囲んでいる場合は、テキスト フィールドがその内容を包み込むのではなく、表のセルを埋めるために制約がセルを引き延ばしていることを確認します。つまり、画像の「編集不可」の矢印が実際にテキスト フィールドの一部を指していることを確認しようとしています。私はそれを期待しています。

というわけで、問題は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:は、次のロジックが使用されます。

  1. YESのインスタンスまたはサブクラスでない限り、提案されたすべてのファーストレスポンダ ビューを返しますNSControl

  2. 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:)。問題は、そのメソッドが応答するヒット テスト コードを除いて、そのメソッドのロジックを再実装するのが簡単ではないことです。

于 2016-03-20T23:52:56.937 に答える