NSPopUpButtonに表示する必要のある要素のリストがあります。ポップアップボタンでリストをアルファベット順に表示したい。さらに、テキストフィールドから文字列を取得してポップアップボタンに挿入する新しいMenuItemがリストにあります。それで、私が聞きたい2つの質問があります:
- NSPopUpButtonで要素のリストをソートされた順序で表示する正しい方法は何ですか?
- 並べ替え順序が維持されるように、NSPopUpButtonへの新しい要素の挿入をどのように処理する必要がありますか?
NSPopUpButtonに表示する必要のある要素のリストがあります。ポップアップボタンでリストをアルファベット順に表示したい。さらに、テキストフィールドから文字列を取得してポップアップボタンに挿入する新しいMenuItemがリストにあります。それで、私が聞きたい2つの質問があります:
を使用しNSArrayController
てポップアップボタン(またはそのメニュー)にデータを入力する場合は、並べ替えを処理するための並べ替え記述子を定義するだけです。
配列コントローラーを最初にポップアップボタンで動作させるのは少し難しいかもしれませんが、ポップアップボタンのコンテンツを配列コントローラーのコンテンツarrangedObjects
にバインドしてから、コンテンツ値をモデルオブジェクトの適切な文字列プロパティにバインドする場合は、次のようにする必要があります。大丈夫。
次に、新しいアイテムを追加するには、アレイコントローラーを介してアイテムを追加するだけです。
したがって、NSArrayController
クラスとバインディングに慣れていない場合は、InterfaceBuilderでそれを行う方法について簡単に説明します。要素に。という文字列プロパティがあると仮定しますname
。
arrangedObjects
コントローラキーに設定します。これは、そのバインディングのデフォルトオプションです。arrangedObjects
コントローラキーとname
モデルキーパスにバインドするポップアップボタンのコンテンツ値を設定します。これにより、メニューに適切なテキストが表示されます。setSortDescriptors:
メソッドを使用)。これを行うには、ファイルの所有者にアレイコントローラーを保持するためのアウトレットを定義することをお勧めします。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];
次のバインディングを使用して、ポップアップボタンを並べ替えることができました。
[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を追加すると、下の画像に示すように、以前に追加されたサブメニューが消えることです
。新しい項目を追加する前に:
新しいアイテムを追加した後:
要素を並べ替えると、同じ動作が表示されます。
この問題を修正するためのアイデアはありますか?
答えてくれてありがとう@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