NSView контекст NSMenu никогда не отображается, хотя все правильные методы вызываются - PullRequest
4 голосов
/ 13 февраля 2011

У меня есть 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, который работает как шарм.

...