O item de menu contextual não está sendo ativado
Pergunta
Eu estou tendo um problema. Meu menu contextual está sendo exibido, mas os itens do menu não estão ativados. Portanto, meu novo código para exibir o menu é o seguinte:
NSMenu *defMenu = [[[NSMenu alloc] initWithTitle:@"default Contextual Menu"] autorelease];
[defMenu insertItemWithTitle:@"Open" action:@selector(openFile) keyEquivalent:@"" atIndex:0];
[defMenu insertItemWithTitle:@"Delete" action:@selector(deleteFile) keyEquivalent:@"" atIndex:1];
return defMenu;
e os declaratonos de função de DeleteFile e OpenFile são os seguintes:
-(int)openFile;
-(int)deleteFile;
E estou chamando meu menu contextual da seguinte maneira:
-(void)doSingleClick
{
if([[NSApp currentEvent] modifierFlags] & NSControlKeyMask)
{
NSLog(@"control clicked.......");
[NSMenu popUpContextMenu:[self defaultMenu] withEvent:[NSApp currentEvent] forView:tableView];
return;
}
}
Meus itens de menu contextual estão todos sombreados e não podem ser clicados. Por favor, você pode dizer onde estou dando errado.
Obrigado
Solução
Sua openFile:
O método toma um int como um parâmetro. Desde insertItemWithTitle:action:withObject:keyEquivalent:atIndex:
leva um objeto, o seletor que você fornece também deve tomar um objeto.
Você pode usar NSNumber
para embrulhar seu int como um objeto e simplesmente mudar seu openFile:
Método para tomar um NSNumber
em vez de um int
. Igual a:
[defMenu insertItemWithTitle:@"Open" action:@selector(openFile:) withObject:[NSNumber numberWithInt:5] keyEquivalent:@"" atIndex:0];
- (void)openFile:(NSNumber *)fileNumber {
int rowClicked = [fileNumber intValue];
// Do whatever your old method did here
}
EDITAR: Para responder sua pergunta atualizada:
O motivo pelo qual os itens do seu menu estão desativados é que você só disse a eles que nome do método chamar. Você nunca disse aos itens em que instância do objeto Esses métodos devem realmente ser chamados. Para consertar isso, você precisa definir o destino dos itens:
NSMenuItem *openItem = [defMenu insertItemWithTitle:@"Open" action:@selector(openFile:) withObject:[NSNumber numberWithInt:5] keyEquivalent:@"" atIndex:0];
[openItem setTarget:self];
E assim por diante para cada item que você tem.
Outras dicas
Você não pode definir essa ação. Uma ação é um método que leva um argumento de objeto que representa o objeto que desencadeou a mensagem de ação. Você precisa criar uma ação no seu controlador que chama o método OpenFile: OpenFile: