2016-12-07 7 views
0

私のCocoaアプリケーションでは、NSTextField(そのまま)とNSScrollView(サブクラス化)を含むウィンドウがあります。私はテキストフィールドとスクロールビューを含むウィンドウのNSViewを管理するNSViewControllerを持っています。テキストフィールドとスクロールビューを含むCocoaビューのタブを処理する

アプリケーションの起動時に、NSTextFieldにフォーカスがあり、入力によってそのテキストボックスに文字が入力されます。私がTabキーを押すと、フォーカスが失われます。しかし、NSScrollViewのように、インタフェース内の他のものは焦点を当てません。キーダウンイベントがどこに起こっているのかは分かりません。

フォーカスをNSScrollViewにどのように転送すると、キーダウンイベント(例:矢印キー、暗黙的な検索など)に影響する可能性がありますか?

答えて

1

まず、Tabキーを繰り返し押して、フォーカスがスクロールビューに移動するか、テキストフィールドに戻るかどうかを確認してください。

スクロールビューに表示されているものは、ドキュメントビューとは言いません。スクロールビュー自体がフォーカスを受け入れるのではなく、ドキュメントビューまたはその子孫ビューの1つがフォーカスを受け入れることがより一般的です。そして、移動キーはそれに渡され、何も消費しなければ、スクロールビューへのレスポンダーチェーンをバブルアップし、自動的にそれらを処理します。

スクロールビューでフォーカスを受け入れる場合は、-acceptsFirstResponderメソッドをオーバーライドしてYESを返す必要があります。

タブの動作は、ウィンドウによって管理されます。キービューループを維持します。ビューが追加および削除されると、キービューループが自動的に再計算されます。おそらく最も信頼できる方法です。 autorecalculatesKeyViewLoopプロパティを参照してください。

autorecalculatesKeyViewLoopをオフにして-recalculateKeyViewLoopを呼び出して、手動で再計算するように指示することもできます。

各ビューのnextKeyViewpreviousKeyViewプロパティをコードまたはInterface Builderのいずれかに接続して、キービューループを明示的に設定することもできます。

+0

スクロールビュー(ドキュメントビュー)に複数のサブビューがあり、いずれにもサブサブビューがない場合、フォーカスは決してテキスト編集フィールドから離れることはありません。しかし、いくつかのサブビューにサブ・サブビュー(バニラNSViews)がある場合、TABを繰り返し押すと、スクロール・ビューには何の注意も表示されませんが、最終的にテキスト編集フィールドに戻ります。サイクル長は、サブサブビューの数に関連するように見える。 – jsbox

+0

サブサブビューの「acceptsFirstResponder」をオフにすると、状況が改善されました。私は "acceptsFirstResponder"をYESに設定しなければならないと考えていたので、mouseDownイベントを受け入れることが判明しました。しかし、スクロールビューのために "acceptsFirstResponder"を設定しても、デフォルトの動作は変更されないように見えるので、それはまだ謎です。 – jsbox

+0

どのようにスクロールビューがフォーカスを得ていないと判断していますか?あなたは 'focusRingType'を変更しようとしましたか?それはnoneにデフォルト設定されている可能性がありますので、視覚的な変更はありません。とにかく、私が言うように、ドキュメントビュー自体がフォーカスを受け入れるのがより一般的です。たとえば、テーブルビューがスクロールビュー内にある場合、それはスクロールビューではなくフォーカスを受け入れるテーブルビューです。 –

関連する問題