0

次のバインディングを使用して NSPopUpButton を並べ替えています。

[arrayController bind:@"contentArray" toObject:self withKeyPath:@"displayElements" options:nil];
[popUpButton bind:@"content" toObject:arrayController withKeyPath:@"arrangedObjects" options:nil];
[popUpButton bind:@"contentValues" toObject:arrayController withKeyPath:@"arrangedObjects.title" options:nil];

displayElementsはNSMenuItemの NSMutable 配列です

displayElements = [[NSMutableArray alloc] initWithObjects:[[NSMenuItem alloc]initWithTitle:@"one" action:nil keyEquivalent:@""],
                                                              [[NSMenuItem alloc]initWithTitle:@"two" action:nil keyEquivalent:@""],
                                                              [[NSMenuItem alloc]initWithTitle:@"three" action:nil keyEquivalent:@""],
                                                              nil];

並べ替えはうまく機能しています。

問題は、メニュー項目のいずれかにサブメニューを追加し、その後新しい NSMenuItem をアレイ コントローラーに追加すると、下の画像に示すように、以前に追加されたサブメニューが消えることです。

新しいアイテムを追加する前に:

ここに画像の説明を入力

新しいアイテムを追加した後:

ここに画像の説明を入力

次のステートメントを使用して、新しい NSMenuItem を追加しています。

[arrayController addObject:[[NSMenuItem alloc]initWithTitle:[newItemTextField stringValue] action:nil keyEquivalent:@""]];

要素を並べ替えると、同じ動作が表示されます。この問題を解決するためのアイデアはありますか??

4

1 に答える 1

0

それforItem:[popUpButton itemAtIndex:[indexValue intValue]]を追加する代わりに、arrayController の項目に追加するとどうなりますか?

後で ArrayController にメニュー項目を追加すると、バインドによって NSPopUpMenu 自体が NSArrayController の値から新しい NSMenuItems を作成するのではないかと思います。また、配列コントローラーのこれらの項目には、ポップアップ ボタンで直接作成したため、サブメニューがありません。

Array Controller に新しい項目を追加するのと同じように、Array Controller の項目にサブメニューを追加する必要があると思います。

サブメニューを配列コントローラーの項目に追加しても、サブメニューがボタン自体に表示されない場合は、おそらく、バインドを再度トリガーして、PopUp ボタンがそのメニューを再構築する必要があることを意味します。これを行うには、サブメニューを配列コントローラーに追加するコードを次のようにラップします [arrayController willChangeValueForKey:@"arrangedObjects"];[arrayController didChangeValueForKey:@"arrangedObjects"];

于 2012-06-25T11:24:41.757 に答える