Контекстное меню FinderSync вызывает действие в неправильном классе

У меня действительно странная проблема: я пишу расширение FinderSync, точнее, я добавляю элементы в контекстное меню. Теперь, если я упаковываю все в один класс, все работает нормально:

1) У меня есть основной класс расширения, который называется FinderSync.

2) В этом классе я реализую

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu

3) В этом методе я пишу (среди прочего):

NSMenuItem *myItem = [[NSMenuItem alloc]
            initWithTitle:@"myTitle" 
            action:@selector(myAction:)
            keyEquivalent:@""];

4) В классе FinderSync существует метод

- (IBAction)myAction:(id)sender;

5) Этот метод вызывается, как и ожидалось, когда пользователь щелкает элемент меню.

Теперь я пытаюсь передать функциональность контекстного меню другому классу, называемому ContextMenuHandler. Ситуация сейчас:

1) У меня есть основной класс расширения, называемый FinderSync, и еще один класс, называемый ContextMenuHandler. FinderSync создает экземпляр ContextMenuHandler и сохраняет на него ссылку (_contextMenuHandler).

2) Оба класса реализуют

- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu

3) Реализация menuForMenuKind в FinderSync не делает ничего, кроме вызова

return [_contextMenuHandler menuForMenuKind:whichMenu];

4) ContextMenuHandler создает NSMenuItem. (Точно такой же код). Я даже пытался добавить:

[myItem setTarget:self];
[myItem setAction:@selector(myAction:)];

Оба класса реализуют myAction.

5) Ожидается: myAction ContextMenuHandler будет вызываться после нажатия на пункт меню Observed: myAction FinderSync вызывается...

Я также перезапускаю Finder после обновлений, и точка останова в ContextMenuHandler срабатывает правильно, поэтому это не похоже на проблему «старой версии FinderSync».

Кто-нибудь может объяснить (или исправить) это странное поведение?


person Christian    schedule 24.06.2015    source источник
comment
Кажется, что есть много проблем, связанных с меню FinderSync. Похоже, что они копируют все элементы меню, возвращенные в фактическое меню Finder (в процессе Finder). Мое лучшее предположение о том, что происходит не так, заключается в том, что они не сохраняют целевое свойство, поэтому по умолчанию используется класс FinderSync. (Возможно, они предполагали, что это всегда будет класс FinderSync, или, возможно, это было связано с соображениями безопасности.)   -  person IntrepidCuriosity    schedule 22.07.2015
comment
Я столкнулся с той же проблемой: stackoverflow.com/ вопросов/31905287/ жаль, что я не прочитал ваш вопрос первым. Хотя никаких объяснений..   -  person Mugen    schedule 19.08.2015


Ответы (1)


Документы FIFinderSyncProtocol включают некоторый полезный контекст:

menu(for menu: FIMenuKind)

Основной объект расширения предоставляет метод для назначенного действия каждого пункта меню.

В котором говорится, что «основной объект расширения» предоставляет метод действия, как вы заметили.

Используются определенные свойства пункта меню: заголовок, действие, изображение и включено.

Начиная с версии 10.11: также работают тег, состояние и уровень отступа, а также разрешены подменю.

Примечательно, что в этом списке поддерживаемых свойств NSMenuItem отсутствует target. Указанная цель для действия не может быть установлена, поэтому Apple просто вызывает действие в подклассе FinderSync.

Я только что столкнулся с похожей проблемой со свойством representedObject. Не сохраняется к тому времени, когда мы получаем пункт меню как sender.

person pkamb    schedule 25.10.2016