Обработка NSMenuDelegate menuWillOpen для смены целей - PullRequest
0 голосов
/ 05 мая 2019

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

Это легко, когда у меня есть только одна цель, например окно настроек или главное приложение.

Но что, если у меня есть приложение на основе документов, и мне нужен дескриптор активного документа menuWillOpen? Тогда делегат больше не является константой.

Какой правильный способ справиться с этим? Должен ли я установить делегата для одного объекта (например, AppDelegate), а затем перенаправить вызов на активный контроллер представления (но как это сделать правильно)? Или есть какой-то другой элегантный способ?

1 Ответ

0 голосов
/ 05 мая 2019

Я придумал этот код, который, кажется, работает:

// This is in my AppDelegate class, and the NSMenu's delegate points to it:
- (void)menuWillOpen:(NSMenu *)menu {
    // Forward to active document controller
    NSWindow *mainWindow = [NSApplication sharedApplication].mainWindow;
    NSResponder *r = mainWindow.firstResponder;
    while (r) {
        if ([r respondsToSelector:_cmd]) {
            [(id<NSMenuDelegate>)r menuWillOpen:menu];
            return;
        }
        r = r.nextResponder;
    }
}

Предполагается, что контроллер в цепочке респондента реализует menuWillOpen:

...