@selector有多个参数

时间:2011-01-15 09:10:31

标签: cocoa macos nsmenu nsmenuitem

首先是我的代码:

   - (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:我正在为mac而不是iPhone做这件事。

2 个答案:

答案 0 :(得分:6)

NSMenuItem有一个名为setRepresentedObject:的方法,菜单项对象将作为sender参数传递给press:方法。

因此,您需要调整代码,使用每个setRepresentedObject:附带的item来调用NSMenuItem,然后在press:中调用[sender representedObject]拿回那件物品。

答案 1 :(得分:4)

我几乎肯定@selector(press:)消息中包含的“sender”参数是 NSMenuItem

所以:

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

那应该记录发件人是被选中的NSMenuItem

编辑误解了问题......

您希望在选择某个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];
}