Пункт контекстного меню не активируется
У меня проблема. Мое контекстное меню отображается, но пункты меню не активированы. поэтому мой новый код для отображения меню выглядит следующим образом:
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;
и объявления функций deleteFile и openFile:
-(int)openFile;
-(int)deleteFile;
и я вызываю мое контекстное меню следующим образом:
-(void)doSingleClick
{
if([[NSApp currentEvent] modifierFlags] & NSControlKeyMask)
{
NSLog(@"control clicked.......");
[NSMenu popUpContextMenu:[self defaultMenu] withEvent:[NSApp currentEvent] forView:tableView];
return;
}
}
все пункты моего контекстного меню затенены и не могут быть нажаты. Пожалуйста, вы можете сказать, где я иду не так.
Спасибо
2 ответа
Ваш openFile:
Метод принимает int в качестве параметра. поскольку insertItemWithTitle:action:withObject:keyEquivalent:atIndex:
берет объект, селектор, который вы даете ему, должен также брать объект.
Ты можешь использовать NSNumber
обернуть ваш int как объект, и просто изменить openFile:
метод взять NSNumber
а не int
, Вот так:
[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
}
РЕДАКТИРОВАТЬ: Чтобы ответить на ваш обновленный вопрос:
Причина, по которой ваши пункты меню отключены, заключается в том, что вы только сказали им, какое имя метода вызывать. Вы никогда не сообщали элементам, на каком экземпляре объекта эти методы должны быть вызваны. Чтобы это исправить, вам нужно установить цель предметов:
NSMenuItem *openItem = [defMenu insertItemWithTitle:@"Open" action:@selector(openFile:) withObject:[NSNumber numberWithInt:5] keyEquivalent:@"" atIndex:0];
[openItem setTarget:self];
И так далее для каждого предмета, который у вас есть.
Вы не можете определить такое действие. Действие - это метод, который принимает один аргумент объекта, представляющий объект, который вызвал сообщение действия. Вам нужно создать действие в вашем контроллере, которое вызывает основной метод openFile:.