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