2013-03-28 2 views
0

Чтобы отобразить контекстное меню на щелчок правой кнопкой на NSOutlineView вы должны подкласс и переопределить:NSOutlineView как подключить контекстное меню делегата

- (NSMenu *)menuForEvent:(NSEvent *)theEvent { 
    NSPoint pt = [self convertPoint:[theEvent locationInWindow] fromView:nil]; 
    id item = [self itemAtRow: [self rowAtPoint:pt]]; 

    // Only the delegate knows how to create a menu based on the item 
    return [self createMenuFor: item]; 
} 

Так что правильный способ получить делегат для создания меню здесь и обрабатывать действия меню?

EDIT - поэтому подкласс не знает, как создать меню, поэтому я просто сделал это. Это нормально? Я просто не видел кода примера, как общаться с делегатом в Интернете.

return [[self delegate] createMenuForItem:item]; 

И, очевидно, определен метод, который передал мне делегат NSMenu.

ответ

1

Во-первых, вы должны называть супер для любых событий, кроме случаев, когда ([theEvent type] == NSRightMouseDown). Я не уверен, что это твоя проблема, но это хорошее место для начала.

Во-вторых, это не метод делегата, поэтому он не имеет ничего общего с подключением любого делегата. Вы можете смело игнорировать это.

В-третьих, ты уверен вы установили имя класса контурный вид к тому из подкласса (подкласса, в котором вы реализованного выше) в Interface Builder или (если вы создали его в коде) указали Ваш новый подкласс в коде?

+0

Итак, теперь у меня есть класс обзора, правильно установленный в IB для моего нового подкласса. Однако проблема заключается в том, что этот новый подкласс не знает, как создать меню. Я только создал его, потому что я вынужден показать меню. Я редактирую вопрос, что я имею в виду. – Mark

+1

В дополнение к 'NSRightMouseDown' вы также хотели бы искать' NSLeftMouseDown' с флагом-модификатором 'NSControlKeyMask' ... – NSGod

+0

Конечно - меню может прибывать из любого места. Это может даже произойти от супер и быть измененным, прежде чем передать его обратно. –

Смежные вопросы