同じタイトルの複数のメニュー項目を NSPopUpButton(NSMenu) に追加するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2320059

質問

ドキュメントに記載されているように、2 つのメニュー項目が同じタイトルの場合、NSPopUpButton に追加することは不可能です。[popupButton menu] にメニュー項目を追加しようとしましたが、うまくいきませんでした。また、新しいメニューを作成し、そこに項目を追加して、[popupButton setMenu:newMenu] を使用しようとしましたが、そうではありません。メニューには、名前ごとに常に 1 つの項目のみが表示されます。

しかし、iTunes でスマート プレイリストを作成しようとすると、左側のポップアップ ボタンから [プレイリスト] を選択し、中央の [=] を選択すると、右側のポップアップ ボタンにすべてのプレイリストのメニュー項目が表示されるので、それが可能であることはわかっています。 iTunes は同じタイトルであっても。では、彼らはどうやってそれを行うのでしょうか?

役に立ちましたか?

解決

まさにその問題がありましたが、簡単に解決できました。使用する代わりに NSポップアップボタン などの方法 –addItemWithTitle: ボタン項目を操作するために、 NSArrayコントローラー 代わりに項目を配列コントローラーに追加しました。次に、バインディングを使用してコントローラーとポップアップ ボタンをバインドすると、同じタイトルの項目が表示されるようになりました。

バインディングを行うには:

  1. を追加 NSArrayコントローラー IBで。
  2. をセットする NSポップアップボタン バインディング "コンテンツ" 「」を使用して配列コントローラーに接続します。コントローラーキー" いる 「配置されたオブジェクト」
  3. をセットする NSポップアップボタン バインディング 「選択されたインデックス」 を使用してアレイコントローラーに 「コントローラーキー」 いる 「選択インデックス」
  4. [オプション] アレイ コントローラーを選択し、 クラス名 アイテムがどのようなクラスであっても属性に含めます。 NS文字列 またはデフォルトを使用することもできます NSMutableDictionary そして、下のボックスにキーを追加すると、項目を辞書でラップし、ポップアップ ボタンに表示したいものとバックグラウンドに表示したいものに異なるキーを追加できます。辞書のどのキーをポップアップ ボタンに反映させるかを設定するには、ポップアップ ボタンのバインディングに移動します。 "コンテンツ" もう一度設定してください 「モーダルキーパス」 配列コントローラー属性に追加したキーに。

他のヒント

そしてaddMenu:addItemWithTitleのようなNSPopUpButton方法は、一方で

は名前の重複を許可しないだろう、同じタイトルのアイテムを持つことは間違いなく可能です。あなたは、単にNSMenuItem自体に名前を設定する必要があります。

あなたは(おそらくプレイリスト名などの)文字列の配列を持っている場合は、たとえば、ポップアップボタンにそれらを追加したい、としてください重複はこのようにそれを行う、そこになりますようにしたい。

NSArray* items = [NSArray arrayWithObjects:@"Foo", @"Bar", @"Baz", @"Foo", nil];

for (NSString* item in items)
{
   [popupButton addItemWithTitle:@"blah"];
   [[popupButton lastItem] setTitle:item];
   [[popupButton lastItem] setTarget:self];
   [[popupButton lastItem] setAction:@selector(something:)];
}
代わりaddItemWithTitle:を使用するには、手動でNSMenuItemを作成することができ、メニューに直接追加します。これはあなたがメニュー内の任意の場所でそれを挿入することができることだけでなく、あなたが望む任意のタイトルを指定することができます。

NSMenuItem* newItem = [[NSMenuItem alloc] initWithTitle:@"foo" action:@selector(something:) keyEquivalent:@""];

[newItem setTarget:self];
[[popupButton menu] addItem:newItem];
[newItem release];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top