2

Interface BuilderでいくつかのNSComboBoxを作成し、1つはプログラムで作成しました。

InterfaceBuilderで作成されたNSComboBoxは完璧です。私はそれらの値を共有ユーザーデフォルトコントローラーにバインドしていて、それらのビューが開かれると、それらは正しい値でそこに座っています。重要なことに、この値はNSComboBoxに「通常の」テキストとして表示されます。つまり、値は選択されていないように見えます。これが私が欲しいものです。

プログラムで作成されたNSComboBoxの場合、selectItemAtIndex:0を使用して値を設定します。これを行うと、正しい項目が選択されますが、テキスト選択されたように見えます。つまり、それは強調表示され、すべてです。これは欲しくない。これが私が試みた回避策です:

(i)フィールドエディタを取得し、挿入ポイントをテキストの最後に設定します。奇妙なことに、これを行うと、フィールドエディタの文字列がnilまたは空になりますが、これは機能しません。これがフィールドエディタの正しい動作かどうかはわかりません。

(ii)setObjectValue、takeStringValueFromなど、コンボボックスの値を設定する他のさまざまな方法を試します。

(iii)最後に、そして最も苛立たしいことに、[myComboBox setValue:@ "The Default Item" forKey:@"value"]を使用してNSComboBoxの値を設定しようとしました。これはobjc_exception_throwで失敗します。おそらく、そのようなKVCキーがないためです。しかし、コンボボックスの値は、インターフェイスビルダーで機能するため、KVOで設定できることを知っています。正しいキーパスがわからないと思います。イントロスペクションを使用してすべてのプロパティを列挙しようとしましたが、コードを正しく機能させることができません(objc_property_tが期待されるヘッダーにありません)。

だから、私は2つの質問があります:

まず、ボックス内のテキストが選択されないように、プログラムでNSComboBoxのデフォルト値を設定する方法を知っている人はいますか?それに関しては、新しいNSComboBoxCellサブクラスを含め、これを行うためにあらゆる努力をします。

次に、誰かがIBがNSComboBoxの値を設定するために使用しているキーまたはキーパスを教えてもらえますか?あるいは、なぜこれを行うための私の努力が失敗しているのですか?

私はこれに何時間も取り組んできました、そして私は本当に意気消沈しています!


ありがとう、mustISignUp!これを修正してくれてとてもうれしいです。少しのフォローアップ:

(i)テキストの選択は間違いなくフォーカスによって引き起こされます。setRefusesFirstResponder:YESを呼び出すと、問題が修正されます。残念ながら、ウィンドウは本当にこのコンボボックスに焦点を合わせたいと考えています。これは、refusesFirstResponderをNOに戻すと(後でウィンドウの開始後に)テキストが再び選択されるためです(ユーザーが必要に応じてこのボックスに焦点を合わせることができるようにしたいと思います)。したがって、私の場合、決定的な解決策は[window makeFirstResponder:otherControl]を呼び出すことでした。奇妙なことに、[window makeFirstResponder:nil]は機能しません。なぜ何かアイデアはありますか?

(ii)バインディングとプロパティの違いを指摘していただきありがとうございます。この質問を調べながら、たくさんのことを学びました。1つは、-(NSArray *)exposedBindingsを呼び出すことでバインディングのリストを取得できることを学びました。これは、NSComboBoxの場合は(fontSize、alignment、toolTip、fontName、enabled、contentValues、fontFamilyName、font、hidden、fontItalic、textColor、value 、コンテンツ、編集可能、fontBold)。次に、[myComboBox bind:@ "value" toObject:[NSMutableString stringWithString:@ "defaultValue"] withKeyPath:@ "string" options:nil]を使用して値を設定できました。ここで、NSMutableStringには「文字列」をプロパティに追加します。最後に、これは実際にはテキスト選択の「問題」を修正しません。

したがって、残っている唯一の質問は、[window makeFirstResponder:nil]がコンボボックスからフォーカスを外すために機能しない理由かもしれません。それほど重要ではありませんが、誰かがアイデアを持っているかどうか知りたいです。

4

1 に答える 1

2

まず、呼び出しselectItemAtIndex:によってコンボボックスがfirstResponderになったため、テキストが選択されたと思います。を使用するsetRefusesFirstResponder:YESか、別のアイテムを最初のレスポンダーにして、テキストが選択されていないようにすることができます。

私が正しく理解していて、コンボボックスの選択を変更したい場合は、正しい方法で行っています。

次に、BindingsとKVCを混同しています。NSComboBoxには、 「value」というプロパティではなく、「value」というバインディングがあります。で設定しようとしても意味がなく、InterfaceBuilderは間違いなくこれを行っていません。setValue:forKey:

これは自明ではなく混乱を招くものであり、バインディングにはより適切な名前が選択されている可能性があると考えるのは正しいでしょう。

于 2010-06-30T23:22:09.963 に答える