пункт контекстного меню не активируется

У меня проблема. Мое контекстное меню отображается, но пункты меню не активированы. Итак, мой новый код для отображения меню выглядит следующим образом:

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;
    }

}

все мои пункты контекстного меню затенены, и их нельзя щелкнуть. Подскажите, пожалуйста, где я ошибаюсь.

Спасибо


person King    schedule 31.08.2009    source источник
comment
Вы не должны удалять вопросы или заменять их другими вопросами после того, как на них ответили. Тогда люди, которые найдут сайт с помощью поиска, не смогут найти старый вопрос и ответы на него. Если вы хотите задать другой вопрос, просто задайте другой вопрос. Вы можете указать ссылку на исходный вопрос, если они связаны. Просто для справки в будущем.   -  person Chuck    schedule 01.09.2009


Ответы (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];

И так далее для каждого предмета, который у вас есть.

person Matt Ball    schedule 31.08.2009
comment
Спасибо, Мэтт за ответ. На самом деле, взглянув на ответ chucks, я изменил свои функции, чтобы они не принимали никаких аргументов. Но теперь у меня возникла новая проблема, то есть мои пункты меню не активируются. Я изменил свой вопрос. Подскажите, пожалуйста, в чем я ошибаюсь? Спасибо - person King; 01.09.2009
comment
Мой ответ был обновлен с учетом этого. В будущем вам действительно не следует редактировать вопрос, чтобы резко изменить его намерение, поскольку это делает ответы, опубликованные до редактирования, несколько бессмысленными. Если ответ на исходный вопрос получен, но в результате возникает не связанная с этим проблема, просто задайте другой вопрос! - person Matt Ball; 01.09.2009

Вы не можете определить такое действие. Действие - это метод, который принимает один аргумент объекта, представляющий объект, вызвавший сообщение действия. Вам нужно создать действие в вашем контроллере, которое обращается к базовому методу openFile :.

person Chuck    schedule 31.08.2009
comment
Спасибо, Чак за ответ. У меня возникла новая проблема, т.е. мои пункты меню не активируются. Я изменил свой вопрос. Подскажите, пожалуйста, в чем я ошибаюсь? Спасибо - person King; 01.09.2009