4

NSPopUpButtonに表示する必要のある要素のリストがあります。ポップアップボタンでリストをアルファベット順に表示したい。さらに、テキストフィールドから文字列を取得してポップアップボタンに挿入する新しいMenuItemがリストにあります。それで、私が聞きたい2つの質問があります:

  1. NSPopUpButtonで要素のリストをソートされた順序で表示する正しい方法は何ですか?
  2. 並べ替え順序が維持されるように、NSPopUpButtonへの新しい要素の挿入をどのように処理する必要がありますか?
4

3 に答える 3

2

を使用しNSArrayControllerてポップアップボタン(またはそのメニュー)にデータを入力する場合は、並べ替えを処理するための並べ替え記述子を定義するだけです。

配列コントローラーを最初にポップアップボタンで動作させるのは少し難しいかもしれませんが、ポップアップボタンのコンテンツを配列コントローラーのコンテンツarrangedObjectsにバインドしてから、コンテンツ値をモデルオブジェクトの適切な文字列プロパティにバインドする場合は、次のようにする必要があります。大丈夫。

次に、新しいアイテムを追加するには、アレイコントローラーを介してアイテムを追加するだけです。

したがって、NSArrayControllerクラスとバインディングに慣れていない場合は、InterfaceBuilderでそれを行う方法について簡単に説明します。要素に。という文字列プロパティがあると仮定しますname

  1. 要素を保持するために、nibファイルの所有者(アプリデリゲートなど)に(可変)配列プロパティを作成します。
  2. InterfaceBuilderでアレイコントローラオブジェクトを作成します。
  3. そのコンテンツ配列を、作成したばかりの配列プロパティにバインドします。バインディングは、XcodeのBindings Inspector(Cmd-Opt-7)で設定できます。
  4. ウィンドウにポップアップボタンを追加します。
  5. ポップアップボタンのコンテンツバインディングをアレイコントローラのarrangedObjectsコントローラキーに設定します。これは、そのバインディングのデフォルトオプションです。
  6. アレイコントローラのarrangedObjectsコントローラキーとnameモデルキーパスにバインドするポップアップボタンのコンテンツ値を設定します。これにより、メニューに適切なテキストが表示されます。
  7. コードのどこかで、並べ替え記述子を作成し、それを配列コントローラーに設定します(setSortDescriptors:メソッドを使用)。これを行うには、ファイルの所有者にアレイコントローラーを保持するためのアウトレットを定義することをお勧めします。
  8. ポップアップボタンに新しい要素を追加するには、配列コントローラーのadd:メソッドを使用します。

これにより、最小限の独自のコードと、InterfaceBuilderの魔法を少し使用できるようになります。

かなり単純なUI要素の場合、バインディングは実際に多くの作業を節約できます。それらについての詳細はこちら

例を追加するために編集:

これを行う方法の例として、プロパティを持つアプリデリゲート、dataプロパティを持つ辞書の配列を持つアプリについて考えてみnameます。これは、配列が単一の文字列のみを保持する例よりも深い抽象化の1つのレベルであることに注意してください。個人的には、そのようにしたいと思います。

self.data = [NSMutableArray arrayWithObjects:
             [NSDictionary dictionaryWithObjectsAndKeys:@"Flowers", @"name", nil],
             [NSDictionary dictionaryWithObjectsAndKeys:@"Animals", @"name", nil],
             [NSDictionary dictionaryWithObjectsAndKeys:@"Trees", @"name", nil],
             nil];

// Sort the array controller alphabetically by the name property
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];

self.arrayController.sortDescriptors = [NSArray arrayWithObject:sd];
于 2012-06-19T10:28:33.067 に答える
1

次のバインディングを使用して、ポップアップボタンを並べ替えることができました。

[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];

また、initのステートメントを次のように変更しました。

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

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を追加すると、下の画像に示すように、以前に追加されたサブメニューが消えることです

。新しい項目を追加する前に:
ここに画像の説明を入力してください


新しいアイテムを追加した後:
ここに画像の説明を入力してください


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

于 2012-06-22T12:11:26.070 に答える
0

答えてくれてありがとう@Monolo

NSArrayControllerからポップアップに値(NSMutableArrayに格納されている)をロードすることができました。しかし、私はまだソートの問題に悩まされています。以下はコードです、私はそれの何が悪いのか理解することができません。
ControllerClass.h

@interface ControllerClass : NSObject{
NSWindow *window;
NSArray *sortDescriptorArray;
NSMutableArray *displayElements;
NSSortDescriptor *sortDescriptor; 
IBOutlet NSArrayController *arrayController;
IBOutlet NSTextField *newItemTextField;
}
@property (readwrite,retain) NSMutableArray *displayElements;
-(id)init;
-(IBAction)AddItem:(id)sender;
@end

================================================== ==========
ControllerClass.m

#import "ControllerClass.h"

@implementation ControllerClass
@synthesize displayElements;
-(id)init
{
    self =[super init];
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"displayElements" ascending:YES];
    sortDescriptorArray = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [arrayController setSortDescriptors:sortDescriptorArray];
    displayElements = [[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];
    return self;
}

-(IBAction)AddItem:(id)sender
{
    [arrayController addObject:[newItemTextField stringValue]];
}
@end
于 2012-06-20T13:24:24.653 に答える