2011-01-15 9 views
1

最初に私のコード:@selector

- (NSMenu*)sourceList:(PXSourceList*)aSourceList menuForEvent:(NSEvent*)theEvent item:(id)item 
    { 
    if ([theEvent type] == NSRightMouseDown || ([theEvent type] == NSLeftMouseDown && ([theEvent modifierFlags] & NSControlKeyMask) == NSControlKeyMask)) { 
     NSMenu * m = [[NSMenu alloc] init]; 
     if (item != nil) { 
     NSLog(@"%@",[item title]); 

     [m addItemWithTitle:[item title] action:@selector(press:) keyEquivalent:@""]; // problem. i want to give "item" as an argument..... 

     for (NSMenuItem* i in [m itemArray]) { 
     [i setTarget:self]; 
     } 
     } else { 
     [m addItemWithTitle:@"clicked outside" action:nil keyEquivalent:@""]; 
     } 
     return [m autorelease]; 
    } 
    return nil; 
    } 
-(void) press:(id)sender{ 
NSLog(@"PRESS"); 
} 

私は、セレクタと私のpress:メソッドに引数としてitemを与えたいです。

はどうもありがとうございました:)

PS:私はマックではないiPhoneのためにこれをやっているし。

答えて

6

NSMenuItemがsetRepresentedObject:と呼ばれる方法、およびメニュー項目のオブジェクトを持っているがpress:メソッドへsenderパラメータとして渡されます。

ですから、各NSMenuItemに行くitemsetRepresentedObject:を呼び出すために、次にpress:にあなたが戻って、そのアイテムを取得するために[sender representedObject]を呼び出すことができ、あなたのコードを調整する必要があります。

+0

+1 whoops、私は 'item'が' NSMenuItem'と異なっていたことを忘れました。 –

+0

ありがとうございました+1 – cocos2dbeginner

4

@selector(press:)メッセージに含まれる「送信者」パラメータがNSMenuItemであることはほぼ肯定的です。

ので:送信者が選択されたNSMenuItemであることをログに記録する必要があり

- (void) press:(id)sender { 
    NSLog(@"sender: %@", sender); 
} 

。質問誤解

編集 ...

あなたは、特定のmenuItemを選択したときにitemオブジェクトを取得します。それは簡単です。ただ、やる:

NSMenuItem * menuItem = [m addItemWithTitle:[item title] action:@selector(press:) keyEquivalent:@""]; 
[menuItem setTarget:self]; 
[menuItem setRepresentedObject:item]; 

は、その後、あなたのpress:方法で...

- (void) press:(id)sender { 
    //sender is the NSMenuItem 
    id selectedItem = [sender representedObject]; 
} 
+0

アイテムはNSMenuItemではありません。 itemは私のカスタムクラスです。それはサブクラスnsmenuitem – cocos2dbeginner

+0

@ cocos2dbeginnerはい、私は@ grahamparksの答えを読むときに気づいた。私はより明快に私の編集した –

+0

私はこれを後で試してみましょう!あなたの答えを受け入れてください:) – cocos2dbeginner