0

選択インデックスがNSWindowControllerサブクラスのプロパティにバインドされているNSPopupButtonがあります。IBでは、ボタンはいくつかの項目で始まります。プロパティの値はNSUserDefaultsから取得され、最初にインスタンス化されたときのNSPopupButtonのアイテムの数よりも多い場合があります。これにより、リストの最後に空白の項目が挿入されます。ボタンにアイテムを追加しても、自動的に作成された空白のアイテムはまだそこにあります。しかし、私が選択を行うと、それは消えます。選択する前に空白のアイテムのタイトルを変更しても、アイテムは消えます。

私は問題をこのコードにまで絞り込みました:

@interface PopUpWindowController : NSWindowController {
    NSUInteger popUpValue;

    IBOutlet NSPopUpButton *popUp;
}

@property NSUInteger popUpValue; //popUp's Selected Index is bound to this property

-(IBAction)addItemsToPopUp:(id)sender;
-(IBAction)nameBlankItem:(id)sender;

@end


@implementation PopUpWindowController

@synthesize popUpValue;

-(id)init {
    if (self = [super initWithWindowNibName:@"PopUpWindow"]) {
        popUpValue = 5; //In my real program this comes from NSUserDefaults
    }
    return self;
}

-(IBAction)addItemsToPopUp:(id)sender {
    //Add three items to popUp
    NSUInteger lastNewItem = [popUp numberOfItems] + 3;
    for (NSUInteger newItem = [popUp numberOfItems]; newItem < lastNewItem; newItem++) {
        [popUp addItemWithTitle:[NSString stringWithFormat:@"%d", newItem + 1]];
    }
    self.popUpValue = 5;
}

-(IBAction)nameBlankItem:(id)sender {
    NSArray *items = [popUp itemArray];
    for (NSUInteger i = 0; i < [items count]; i++) {
        if (![[[items objectAtIndex:i] title] length]) {
            //item title is blank so set it to the item number
            [[items objectAtIndex:i] setTitle:[NSString stringWithFormat:@"%d", i + 1]];
        }
    }
}

@end

ウィンドウが最初に表示されたときのポップアップのメニューは次のとおりです(IBには「1」、「2」、「3」という名前の3つの項目があります)。

メニューv1

こちらはお電話後ですaddItemsToPopUp:

メニューv2

こちらはお電話後ですnameBlankItem:

メニューv3

それから私はaddItemsToPopUp:再び電話をしました:

メニューv4

これで、最終的に選択を行い、メニューを再度ポップアップします。

メニューv5

どこに行った4の?

私の実際のプログラムでは、メニュー項目を「1」..「n」(nは計算されたNSArray内の項目の数で定義されます)にします。私は別のアプローチを受け入れていますが、ソリューションが引き続きNSPopupButtonを使用することを望んでいます。

(重要な場合は、OS X10.5.8ではXcode3.1.2を使用していますが、OS X10.6.8ではXcode3.2でもテストしています。)

4

1 に答える 1

0

NSPopUpButtonのContentValuesプロパティをオブジェクトの配列にバインドすることで、問題を解決しました。そのため、Cocoaが舞台裏で行っていることと組み合わせてボタンのアイテム配列を手動で操作する代わりに、コンテンツを完全に制御できます。

于 2012-01-08T18:54:58.590 に答える