2

いくつかのネストされたレイヤーを含むNSDictionaryを作成しましたが、これをNSMenuとして複製して、NSDictionaryが更新されたときにNSMenuも更新されるようにします。たとえば、次を含むNSDictionaryがある場合:

Item1
 |---Item 1.1
 |---Item 1.2

Item2
 |---Item 2.1
 |    |---Item 2.1.1
 |---Item 2.2
 |---Item 2.3 

Item3

これにより、メニューが3つのエントリ(アイテム1、アイテム2、アイテム3)で作成されるはずです。アイテム1とアイテム2はサブメニューであり、アイテム2.1なども同様です。

アイテム2を削除すると、アイテム2とそのすべてのサブメニューも削除されます。

問題は、これにどのようにアプローチすればよいかわからないことです。私はNSMenuをプログラムで作成する方法を知っているので、まったく知識がなくてもこれに取り組むことはありませんが、この方法でバインディングをシミュレートする方法についての最初のアイデアはありません。

どんな助けでも最もありがたいことに受け取られるでしょう。

4

1 に答える 1

3

これを行う方法は、オブジェクトをメニューデリゲートとして設定することです(を参照NSMenuDelegate)。メニュー項目のタグを一意の値に設定し、起動時にそのメニュー項目を見つけました。App Delegateをメニューデリゲートとして使用し、次のデリゲートメソッドを実装してメニューを作成します。

- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu;

- (BOOL)menu:(NSMenu *)menu
  updateItem:(NSMenuItem *)item
     atIndex:(NSInteger)index
shouldCancel:(BOOL)shouldCancel;

任意に複雑な辞書構造の複雑さが増すため、各メニュー項目(メニューテキストとセレクターを文字列として、その他必要なもの)を格納するカスタムクラスを作成する必要があります。次に、これらのアイテムとサブディクショナリをメインディクショナリ内に保存します。

ディクショナリを(menu:updateItem:atIndex:shouldCancel:デリゲートメソッドで)列挙する場合は、を使用してオブジェクトのタイプ(カスタムオブジェクトまたはディクショナリ)をテストする必要がありますisKindOfClass。任意のネストを処理するには、プライベートで再帰的なメソッドを使用することをお勧めします。それは単一の辞書を扱います。

幸運を; それは単純ではありませんが、確かに達成可能です。

于 2013-02-15T18:18:58.667 に答える