Как Вы добавляете контекст чувствительное меню к NSOutlineView (т.е. меню правой кнопки)

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

21
задан Jacob 22 August 2009 в 02:37
поделиться

1 ответ

В методе menuForEvent вы можете узнать, в какой строке произошел щелчок. Вы можете передать это как параметр в свой метод defaultMenu - возможно, назовите его defaultMenuForRow:

-(NSMenu*)menuForEvent:(NSEvent*)evt 
{
    NSPoint pt = [self convertPoint:[evt locationInWindow] fromView:nil];
    int row=[self rowAtPoint:pt];
    return [self defaultMenuForRow:row];
}

Теперь вы можете создать меню для строки, которую вы нашли в событии ...

-(NSMenu*)defaultMenuForRow:(int)row
{
    if (row < 0) return nil;

    NSMenu *theMenu = [[[NSMenu alloc] 
                                initWithTitle:@"Model browser context menu"] 
                                autorelease];
    [theMenu insertItemWithTitle:@"Add package" 
                          action:@selector(addSite:) 
                   keyEquivalent:@"" 
                         atIndex:0];
    [theMenu insertItemWithTitle:[NSString stringWithFormat:@"Remove '%i'", row] 
                          action:@selector(removeSite:) 
                   keyEquivalent:@"" 
                         atIndex:0];
    // you'll need to find a way of getting the information about the 
    // row that is to be removed to the removeSite method
    // assuming that an ivar 'contextRow' is used for this
    contextRow = row;

    return theMenu;        
}

Кроме того, как уже упоминалось в комментариях, вам действительно не следует использовать префикс NS в ваших собственных классах. В будущем есть вероятность столкновения, плюс это запутает всех, кто смотрит на ваш код, включая вас:)

Надеюсь, это поможет ...

23
ответ дан 29 November 2019 в 20:55
поделиться