2014-12-07 10 views
7

Zaimplementowałem rozszerzenie Finder Sync zgodnie z dostarczoną próbką podaną przez Apple.Synchronizacja Findera: Nadawca przekazany do działania jest innym wystąpieniem NSMenuItem

Po kliknięciu nowo utworzonego elementu menu kontekstowego wykonywane jest odpowiednie działanie sampleAction. Niestety nadawca przekazany do metody nie pasuje do instancji utworzonej w menuForMenuKind.

Kod

- (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); 
    } 
} 

wyniki w następujący wynik po kliknięciu na element w menu kontekstowym

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: '' 

.

Czy istnieje możliwość połączenia nadawcy z pozycją menu, na którą kliknięto?

+0

Masz jakieś rozwiązanie? –

+0

Jeszcze nie, niestety :( –

+0

hmm powiadomić Apple o Twoich potrzebach za pomocą systemu zgłaszania błędów Apple. Teraz używam innego selektora dla różnych pozycji menu. –

Odpowiedz

7

Jest to pozornie zamierzone zachowanie. I złożył raport o błędzie z Apple, a to była ich odpowiedź:

Kwestia ta zachowuje się w sposób zamierzony oparte na następujących zasadach:

Finder Sync nie trzymać się wokół konkretnego NSMenuItem * instancje i bardzo kilka właściwości są przestrzegane (tylko tytuł, akcja, obraz i włączony). W przyszłej wersji właściwość -tag będzie prawdopodobnie obsługiwana, ale nie -representedObject. - Jeśli potrzebujesz dynamicznego zestawu działań, powinno być możliwe korzystanie z takich funkcji, jak sel_registerName i method_setImplementation (in) do tworzenia metod w środowisku wykonawczym.

1

Dokumenty oferują najlepszą dokumentację dla tych menu i metod, które mogę znaleźć. wykorzystywane

menu(for menu: FIMenuKind)

Specyficzne właściwości elementu menu są: tytuł, akcja, zdjęcie, a następnie włączone.

Począwszy od 10.11: tag, state i indentationLevel również działają, a podmenu są dozwolone.

Właściwość tag, która nie była zachowywana, gdy zadajesz to pytanie, jest teraz zachowana w systemie MacOS 10.11+.

Właściwość jest nie utrzymywała się do czasu otrzymania wywołania zwrotnego, co byłoby niezwykle przydatne. Obiekt NSMenuItem różni się także o ten punkt.

To nie jest idealne, ale pole nalegania (i niewidoczne dla użytkownika) musi teraz być wystarczające do przekazania informacji z tworzenia menu i wywołania zwrotnego akcji.

Powiązane problemy