Как мне получить цель щелчка элемента управления в NSOutlineView

#nsoutlineview #nstreecontroller

#nsoutlineview #nstreecontroller

Вопрос:

У меня есть NSOutlineView, управляемый NSTreeController. NSOutlineView подключен к контекстному меню в Interface Builder.

Щелчок элемента управления вызывает мое меню, и строка, на которую нажата, «выбрана» с бледным выделением с рамкой.

Кажется, я не могу найти какой-либо способ определить, какая строка «выбрана». selectionIndexPath и selectedObjects равны нулю.

Ответ №1:

Вы хотите использовать clickedRow . Обратите внимание, что это становится немного сложнее, если вы поддерживаете множественный выбор, потому что контекстное меню нацеливает выделение, если выбранная строка находится внутри него, тогда как при щелчке в другом месте (одиночная) выбранная строка является целевой, и выбор игнорируется.

Вот пример некоторого кода, который я написал, чтобы справиться с этим:

 - (NSArray *)selectedURLs;
{
    NSInteger clickedRow = [outlineView clickedRow];
    NSArray *selectedObjects;

    if (clickedRow == -1 || [[outlineView selectedRowIndexes] containsIndex:clickedRow])
        selectedObjects = [treeController selectedObjects];
    else
        selectedObjects = [NSArray arrayWithObject:[[outlineView itemAtRow:clickedRow] representedObject]];

    return [selectedObjects valueForKey:SSTreeNodeAttributes.fileReferenceURL];
}
 

Комментарии:

1. Спасибо за комментарий. Я отказался от NSOutlineView и написал свои собственные источники данных и т.д. Это позволило мне переопределить - (NSMenu *)menuForEvent:(NSEvent *)theEvent { NSPoint pt = [self convertPoint:[theEvent locationInWindow] fromView:nil]; focusedItem = [self itemAtRow: [self rowAtPoint:pt]]; return [self menu]; }