Setting Actions for PopUpButton
-
31-05-2021 - |
문제
I have created an NSPopUpButton programmatically and I made an array for my choices, how can I create a setAction for each individual array choice? Thanks!
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");
}
해결책
You need to add the NSMenuDelegate
protocol to your interface (.h file):
@interface MyClass : NSObject <NSMenuDelegate>
Then:
[[button menu]setDelegate:self];
after you create the NSPopUpButton
. Also, remove the line with setAction:
.
Copy this delegate method:
-(void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item
{
if ([item.title isEqualToString:@"Blue Color"]) { ... } //etc
}
Add the necessary if statements to complete the comparisons.
다른 팁
Another option for this is the use the setAction
method you originally had in your code. But then for the selector you choose to call set it up to receive a sender object. Something like this:
-(void)method:(NSMenuItem *)sender
Then you can verify that the sender object is valid and get the title from that instead. I'm a little wary of using NSMenuDelegate
for this.