Синхронизация Finder: отправитель перешел к действию - это другой экземпляр NSMenuItem
Я реализовал расширение Finder Sync в соответствии с предоставленным образцом, предоставленным Apple.
После нажатия на вновь созданный пункт контекстного меню, соответствующее действие sampleAction
выполнен. К сожалению, отправитель, переданный методу, не соответствует экземпляру, созданному в menuForMenuKind
,
Код
- (NSMenu *)menuForMenuKind:(FIMenuKind)whichMenu
{
NSMenuItem* menuItem = [[NSMenuItem alloc] initWithTitle:@"testTitle" action:@selector(sampleAction:) keyEquivalent:@""];
menuItem.tag = 1;
// print menu attributes
NSLog(@"------------------original menu-----------------");
NSLog(@"menu address: %p", menuItem);
NSLog(@"menu tag: %ld", menuItem.tag);
NSLog(@"menu title: '%@'", menuItem.title);
NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
[menu addItem:menuItem];
return menu;
}
- (IBAction)sampleAction:(id)sender
{
if( [sender isKindOfClass:[NSMenuItem class]])
{
NSMenuItem* menuItem = sender;
NSLog(@"------------------menu passed to action-----------------");
NSLog(@"menu address: %p", menuItem);
NSLog(@"menu tag: %ld", menuItem.tag);
NSLog(@"menu title: '%@'", menuItem.title);
}
}
приводит к следующему выводу после того, как я нажал на элемент в контекстном меню
2014-12-07 19:55:36.923 FinderSync Extension[1265:62630] ------------------original menu----------------
2014-12-07 19:55:36.923 FinderSync Extension[1265:62630] menu address: 0x6080000abbe0
2014-12-07 19:55:36.924 FinderSync Extension[1265:62630] menu tag: 1
2014-12-07 19:55:36.924 FinderSync Extension[1265:62630] menu title: 'testTitle'
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] ------------------menu passed to action----------------
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu address: 0x6080000aba00
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu tag: 0
2014-12-07 19:55:40.328 FinderSync Extension[1265:62630] menu title: ''
,
Есть ли возможность связать отправителя с пунктом меню, по которому щелкнули?
2 ответа
Для справки, это явно предполагаемое поведение. Я подал отчет об ошибке в Apple, и это был их ответ:
Эта проблема ведет себя как задумано, основываясь на следующем:
Finder Sync не хранит определенные экземпляры NSMenuItem*, и соблюдаются очень немногие свойства (только заголовок, действие, изображение и включено). В будущем выпуске свойство -tag, скорее всего, будет поддерживаться, но не -representedObject. - Если вам требуется динамический набор действий, должна быть возможность использовать такие функции, как sel_registerName и method_setImplementation (in), для создания методов во время выполнения.
FIFinderSyncController
/ FIFinderSyncProtocol
Документы предлагают лучшую документацию для этих меню и методов, которые я могу найти.
menu(for menu: FIMenuKind)
Используются определенные свойства пункта меню: заголовок, действие, изображение и включено.
Начиная с 10.11: tag, state и indentationLevel также работают, и подменю разрешены.
tag
свойство, которое не было сохранено, когда вы задавали этот вопрос, теперь сохраняется в macOS 10.11+.
representedObject
свойство не сохраняется к тому времени, когда мы получаем обратный вызов, что было бы чрезвычайно полезно. Объект NSMenuItem также отличается в этом отношении.
Это не идеально, но теперь сохранилось (и невидимо для пользователя) tag
поле должно быть достаточно для передачи информации от создания меню и обратного вызова действия.