2013-04-16 2 views
1

У меня есть NSOutlineView, а также создано меню, которое отображается как контекстное меню, когда я нажимаю правой кнопкой мыши на любом элементе.Как я могу получить элемент, который был нажат правой кнопкой мыши в контекстном меню в NSOutlineView?

Теперь у меня есть 2 проблемы.

  1. Как я могу идентифицировать элемент, который был щелкнут правой кнопкой мыши, чтобы действовать соответствующим образом по любой функции в контекстном меню.
  2. Как изменить контекстное меню, прежде чем открыть его для удаления или отключения элемента меню в зависимости от элемента, который был щелкнут правой кнопкой мыши?

ответ

0

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

Я решил эту проблему, путем реализации следующий метод (который также отвечает на второй вопрос):

- (void)menuNeedsUpdate:(NSMenu *)menu 

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

if ([[arrayController selectedObjects] count] == 0 || [[arrayController selectedObjects] count] == 1) { 
     if ([myTable clickedRow] != -1) { 
      [myTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[myTable clickedRow]] byExtendingSelection:FALSE]; 
     } 
    } 

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

Что касается второго вопроса, вы можете использовать вышеуказанный метод, чтобы получать уведомления каждый раз, когда NSMenu будет отображаться.

+0

Поведение по умолчанию в OS X не должно автоматически выбирать элемент, щелкнув правой кнопкой мыши (контекстное меню) – Jay

1

Метод clickedRow (унаследованный от NSTableView) предоставит вам номер строки.

Номер строки затем может быть преобразован в элемент с использованием NSOutlineView's itemForRow.

Для части меню метод NSMenuDelegatemenu:updateItem:atIndex:shouldCancel: вызывается непосредственно перед отображением меню, поэтому вы можете изменить его по мере необходимости.

Согласно docs, вы также должны реализовать numberOfItemsInMenu:.

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

+0

Я добавил и реализовал метод , но метод не называется ?! Я что-то пропустил? – eemceebee

+0

работает. У меня есть делегат для FileOwner, который является моим главным ViewController – eemceebee

+0

, использующим автозаполнение «ESC». Я увольлю опечатку. – eemceebee

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