2011-11-05 9 views
5

sto costruendo la mia personalizzato Menu Edit (UIMenuController) e sto usando il tipico metodo diSelettore per "Definire" voce di menu Modifica in iOS 5

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

attivare condizionatamente/disabilitare le impostazioni predefinite del sistema. I metodi di modifica tipici sono ben documentati (copy :, cut :, ecc.), Ma non riesco a trovare nulla su quale sia il metodo chiamato dall'opzione "Definisci" per aprire il nuovo dizionario delle parole in iOS 5. Forse è nascosto in bella vista, ma ho passato ore a cercarlo, quindi gradirei qualsiasi aiuto. In particolare, ho bisogno:

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

ma mi danno ciò che accade realmente nel posto di "defineWord:"

ps - non mi dispiacerebbe sapere quale classe il metodo appartiene, solo per curiosità (copia: appartiene a UIResponderStandardEditActions, per esempio)

risposta

5

Implementando questo:

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

ho potuto vedere che il selettore è "_define:".

+0

Grazie, sia per la risposta e come avete capito bene (un suggerimento utile) !! ! – Michael

+1

La mia app è stata respinta a causa di _define :. Il centro risoluzioni afferma che il motivo è "2.5: le app che utilizzano API non pubbliche verranno rifiutate". – tokentoken

5

Il selettore di definizione (_define :) è in realtà privato e la tua app verrà rifiutata se la utilizzi. Quello che ho dovuto fare per ottenere solo la voce di menu Definizione di presentarsi in un UITextView era questo:

- (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

Hai assolutamente ragione - ieri ho ricevuto la mia lettera di rifiuto, e non ero molto sorpreso perché potevo dire che era privato (si lamentava Xcode). Per ora ho appena disabilitato il codice e rimosso l'opzione Define, e proverò una variante di ciò che hai sopra nella prossima versione. – Michael

+0

@Michael Surran come si rimuove definire senza usare il selettore _define? – CedricSoubrie

+0

Fondamentalmente restituisco SÌ per le voci del menu di modifica che desidero utilizzare (BOOL) canPerformAction: (SEL) azione con il mittente di Sender (id). Ritorna NO per tutto il resto (che include il selettore _define). – Michael

0

In iOS 7.1 vedo queste azioni che si verificano quando l'override del metodo canPerformAction:withSender: su una sottoclasse di UIWebView:

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

Presumibilmente quelli preceduti da un trattino basso sono "API private" il cui utilizzo sottopone l'app al rifiuto da parte dell'App Store. Ma non riesco a trovare alcuna documentazione su quel modo o sull'altro.

Quelli senza un carattere di sottolineatura sono definiti come parte del protocollo informale UIResponderStandardEditActions.

0

Un modo semplice per farlo senza usare privateAPI, tornare YES solo per azione voluta

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

Godere;)