2011-01-15 8 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"); 
} 

Я хочу дать item в качестве аргумента для моего press: метода с селектором.

Большое спасибо :)

PS: Я делаю это для макинтош не iPhone.

ответ

6

NSMenuItem имеет метод setRepresentedObject:, а объект пункт меню будет передан в качестве параметра метода press:sender.

Так что вам нужно настроить код для вызова setRepresentedObject: с item, который идет с каждым NSMenuItem, а затем в press: вы можете вызвать [sender representedObject], чтобы получить этот товар.

+0

+1 кричит, я пропустил, что 'item' отличается от' NSMenuItem'. –

+0

спасибо, что он работал +1 – cocos2dbeginner

4

Я почти уверен, что параметр «отправитель», который включен в сообщение @selector(press:), :NSMenuItem.

Итак:

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

Это должно войти что отправитель является NSMenuItem, который был выбран.

редактировать неправильно истолкованы вопрос ...

Вы хотите получить 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

пункт НЕ НЕМУЮТ. item - это пользовательский класс от меня. Это не подкласс nsmenuitem – cocos2dbeginner

+0

@ cocos2dbeginner да, я понял, что когда я прочитаю ответ @grahamparks. Я редактировал мой для большей ясности –

+0

спасибо, я попробую это позже! и затем примите свой ответ. :) – cocos2dbeginner

Смежные вопросы