2012-04-14 6 views
2

プログラムでNSPopUpButtonを作成し、選択肢の配列を作成しました。個々の配列の選択に対してsetActionを作成するにはどうすればよいですか?ありがとう!PopUpButtonのアクションを設定する

NSRect buttonRect = NSMakeRect(1705, 145, 78, 50); 

    //Button Array. When I pick the choice it closes the diologue box 
    NSArray *newArray; 
    NSString *color1 = @"Blue Color"; 
    NSString *color2 = @"Green Color"; 
    NSString *color3 = @"Clear Color"; 

    newArray = [NSArray arrayWithObjects: color1, color2, color3, nil]; 

    NSPopUpButton *button = [[NSPopUpButton alloc] initWithFrame:buttonRect pullsDown:YES]; 
    [self addSubview:button]; 
    [button addItemsWithTitles:newArray]; 
    //want my action for each individual string 
    [button setAction:@selector(changeFilterColor)]; 

-(void) changeFilterColor 
{ 
    NSLog(@"colorChanged"); 

} 
+1

[button setTarget:self]が見つからないようです。 – johndpope

答えて

5

あなたのインターフェイス(.hファイル)にNSMenuDelegateプロトコルを追加する必要があります。

@interface MyClass : NSObject <NSMenuDelegate> 

その後:

[[button menu]setDelegate:self]; 

あなたがNSPopUpButtonを作成した後。また、setAction:の行を削除します。

コピーこのデリゲートメソッド:文が比較を完了する場合

-(void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item 
{ 
    if ([item.title isEqualToString:@"Blue Color"]) { ... } //etc 
} 

は、必要に応じて追加します。

+0

プロトコルに何を追加しますか? ' - (void)menu:'? –

+0

私は私の答えを修正しました。 –

+0

ありがとう!正常に動作します! –

2

もう1つのオプションは、元々あなたのコードで使用していた方法を使用することです。しかし、セレクタを呼び出すことを選択すると、送信者オブジェクトを受け取るように設定されます。

-(void)method:(NSMenuItem *)sender 

次に、送信者オブジェクトが有効であることを確認し、その代わりにタイトルを取得できます。私はこのためにNSMenuDelegateを使用するのを少し気にしています。