У меня есть NSCollectionView
с кучей NSView
s, сложенных вертикально, чтобы это выглядело как UIKit
s UITableView
. Все работает как положено, кроме одного:
При щелчке правой кнопкой мыши по любому из NSView
я ожидаю, что NSMenu
, который я установил для просмотра menu
, будет отображаться, но, увы, ничего не происходит.
Сумасшедшая часть в том, что все правильные методы вызываются, как и следовало ожидать: -rightMouseDown:
, -menuForEvent:
и, наконец, -menu
.
Когда я устанавливаю какой-либо объект как NSMenu
s delegate
, menuWillOpen:
вызывается , а не , так что мне кажется, что что-то сбой на стороне вещей Apple, между запрашивая menu
и фактически показывая его.
Кто-нибудь сможет пролить свет на это?
Заранее спасибо.
PS. Для чего стоит, NSMenu
s, которые я представляю вручную (не полагаясь на обработку щелчком правой кнопкой мыши Apple), используя popUpMenuPositioningItem:atLocation:inView:
, показаны.
Редактировать / Обновить / Уточнить
Указанный NSCollectionView
находится внутри NSWindow
, который отображается при нажатии на NSStatusItem
, как CoverSutra / TicToc / что у вас есть. Некоторый код из MyWindow
NSWindow
подкласса:
- (void)awakeFromNib {
[self setStyleMask:NSBorderlessWindowMask];
[self setExcludedFromWindowsMenu:YES];
}
- (BOOL)canBecomeMainWindow {
return YES;
}
- (BOOL)canBecomeKeyWindow {
return YES;
}
- (BOOL)isMovable {
return NO;
}
- (void)presentFromPoint:(NSPoint)point {
point.y -= self.frame.size.height;
point.x -= self.frame.size.width / 2;
[self setFrameOrigin:point];
[self makeMainWindow];
[self makeKeyAndOrderFront:self];
}
presentFromPoint:
- это метод, который я использую, чтобы представить его из любой точки, которая мне нравится, в моем случае чуть ниже NSStatusItem
. (Не очень относится к этой проблеме)
У моего приложения LSUIElement
в Info.plist
установлено значение YES
, поэтому в нем не отображается строка меню или значок Dock. Он находится в строке состояния и имеет окно, которое отображается при нажатии NSStatusItem
.
Иерархия представлений выглядит следующим образом:
MyWindow
=> contentView
=> NSScrollView
=> NSCollectionView
NSCollectionView
имеет подкласс NSCollectionViewItem
, связанный с его свойством itemPrototype
, а подкласс NSCollectionViewItem
имеет подкласс NSView
, связанный с его свойством view
.
Подкласс NSView
, в свою очередь, имеет NSMenu
, связанный с его свойством menu
.
И последнее по порядку, но не по значению: внутри этого NSMenu
есть один NSMenuItem
.
И подкласс NSCollectionViewItem
, и подкласс NSView
на данный момент ничего интересного не делают, они просто пустые подклассы.
NSMenu
, подключенное к свойству NSView
menu
, - это то, что должно отображаться при щелчке правой кнопкой мыши по NSView
, но, как я надеюсь, я ясно дал понять: на самом деле оно не отображается.
Обновление
Я до сих пор не знаю, что послужило причиной этой проблемы, но я решил «уйти» с NSCollectionView
, так как он все равно не подходил для того, что я пытался сделать, и сейчас я использую TDListView
, который работает как шарм.