2011-11-05 14 views
5

estoy construyendo mi propio menú personalizado Editar (UIMenuController) y estoy usando el método típico deselector de "Definir" elemento de menú Editar en IOS 5

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

para permitir condicionalmente/desactivar los valores predeterminados del sistema. Los métodos de edición típicos están bien documentados (copy :, cut :, etc.), pero no encuentro nada sobre qué método utilizar en la opción de menú "Definir" para extraer el nuevo diccionario de palabras en iOS 5. Tal vez sea ocultándome a plena vista, pero he pasado horas buscándolo, así que agradecería cualquier ayuda. Específicamente, necesito:

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

pero dame lo que realmente sucede en el lugar de "defineWord:"

PS - Yo no le importaría saber qué clase pertenece el método que, sólo por curiosidad (copia: pertenece a UIResponderStandardEditActions, por ejemplo)

Respuesta

5

Mediante la implementación de este:

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

pude ver que el selector es "_define:".

+0

Gracias, tanto para la respuesta y la forma en que lo tienes (un consejo útil) !! ! – Michael

+1

Mi aplicación se rechaza debido a _define :. El centro de resolución dice que el motivo es "2.5: las aplicaciones que usan API no públicas serán rechazadas". – tokentoken

5

El selector de definición (_define :) es en realidad privado y su aplicación será rechazada si la usa. Lo que tenía que hacer para obtener sólo el elemento de menú Definir a aparecer en un UITextView era la siguiente:

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

Tiene toda la razón: ayer recibí mi carta de rechazo y no me sorprendió porque pude decir que era privada (se quejó Xcode). Por ahora, desactivé el código y eliminé la opción Definir, y probaré una variante de lo que tienes arriba en la próxima versión. – Michael

+0

@Michael Surran ¿cómo se elimina definir sin usar el selector _define? – CedricSoubrie

+0

Básicamente, devuelvo SÍ para los elementos del menú de edición que quiero usar (BOOL) acción CanPerformAction: (SEL) con el remitente deSender (id). Devuelvo NO para todo lo demás (que incluye el selector _define). – Michael

0

En iOS 7.1 Veo estas acciones que ocurren cuando reemplazando el método canPerformAction:withSender: en una subclase de UIWebView:

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

Es de suponer que los que llevan el guion bajo son "API privada", cuyo uso somete a su aplicación a rechazo por la tienda de aplicaciones. Pero realmente no puedo encontrar ninguna documentación sobre eso de una manera u otra.

Los que no tienen un guión bajo se definen como parte del protocolo informal UIResponderStandardEditActions.

0

Una forma sencilla de hacerlo sin utilizar privateAPI, volver SÍ sólo para la acción deseada

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

Enjoy;)