2011-11-05 17 views
5

buduję własną zwyczaj Edit Menu (UIMenuController) i używam typowySelector dla "Define" element menu Edycja w iOS 5

-(BOOL)canPerformAction:(SEL)action withSender(id)sender 

metodę warunkowo włączyć/wyłączyć domyślne ustawienia systemowe. Typowe metody edycji są dobrze udokumentowane (copy :, cut :, itp.), Ale nie mogę znaleźć nic o tym, jaka metoda jest wywoływana przez opcję menu "Definiuj", aby wyciągnąć nowy słownik słów w iOS 5. Może to ukrywając się przed wzrokiem, ale spędziłem wiele godzin, szukając tego, więc doceniam każdą pomoc. Konkretnie, muszę:

if (action == @selector(defineWord:)) ...... 

ale daje mi to, co naprawdę dzieje się w miejscu „defineWord:”

ps - ja nie wiedząc, co klasa metoda należy, po prostu z ciekawości (kopia: należący do UIResponderStandardEditActions, na przykład)

Odpowiedz

5

Realizując to:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    NSLog(@"%@", NSStringFromSelector(action)); 
} 

byłem w stanie zobaczyć, że przełącznik jest "_define".

+0

Dzięki, zarówno na odpowiedź i jak masz to (przydatna wskazówka) !! ! – Michael

+1

Moja aplikacja została odrzucona z powodu _definiowania :. Centrum rozstrzygnięć twierdzi, że powodem jest "2.5: aplikacje korzystające z niepublicznych interfejsów API zostaną odrzucone". – tokentoken

5

Definicja selektora (_define :) jest w rzeczywistości prywatna, a twoja aplikacja zostanie odrzucona, jeśli z niej korzystasz. Co miałem zrobić, aby dostać tylko zdefiniować pozycję menu, aby pokazać się w UITextView było to:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(cut:) || 
     action == @selector(copy:) || 
     action == @selector(select:) || 
     action == @selector(selectAll:) || 
     action == @selector(paste:) || 
     action == @selector(delete:)) 
    { 
     return NO; 
    } 
    else return [super canPerformAction:action withSender:sender]; 
} 
+0

Masz absolutną rację - otrzymałem wczoraj list odrzucony i nie byłem naprawdę zaskoczony, ponieważ mogłem powiedzieć, że był prywatny (skarżył się Xcode). Na razie właśnie wyłączyłem kod i usunąłem opcję Definiuj, a spróbuję wariant tego, co masz powyżej w następnej wersji. – Michael

+0

@Michael Surran Jak usunąć definicję bez użycia selektora _define? – CedricSoubrie

+0

Zasadniczo zwracam TAK dla elementów menu edycji Chcę użyć (BOOL) canPerformAction: (SEL) akcja z nadawcą (identyfikatorem) nadawcy. Zwracam NO dla wszystkiego innego (który zawiera selektor _define). – Michael

0

w iOS 7.1 widzę te działania zachodzące gdy przesłanianie metody canPerformAction:withSender: na podklasy UIWebView:

cut: 
copy: 
select: 
selectAll: 
paste: 
delete: 
_promptForReplace: 
_showTextStyleOptions: 
_define: 
_addShortcut: 
_accessibilitySpeak: 
_accessibilitySpeakLanguageSelection: 
_accessibilityPauseSpeaking: 
makeTextWritingDirectionRightToLeft: 
makeTextWritingDirectionLeftToRight: 

Przypuszczalnie te z prefiksem z podkreśleniem to "prywatny interfejs API", którego użycie powoduje odrzucenie aplikacji przez App Store. Ale tak naprawdę nie mogę znaleźć żadnej dokumentacji na ten temat.

Te bez podkreślenia są zdefiniowane jako część nieformalnego protokołu UIResponderStandardEditActions.

0

Łatwy sposób to zrobić bez użycia privateAPI, powrót TAK tylko dla pożądanego działania

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(MySelector:) 
    { 
     return [super canPerformAction:action withSender:sender] 
    } 
    else 
    return NO; 
} 

Enjoy;)