首先是我的代码:
- (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做这件事。
答案 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];
}