Синхронизация 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 поле должно быть достаточно для передачи информации от создания меню и обратного вызова действия.

Другие вопросы по тегам