2012-03-26 18 views
7

Creé un UIMenuController personalizado en un UIWebView pero parece deshacerse de la opción "Hablar selección" en el UIMenuController después de eso. La opción de selección de hablar está activada en Preferencias en todos los dispositivos de prueba y aparece en otras aplicaciones, incluidas las que no son de Apple. ¿Hay algún servicio de accesibilidad o parte del sharedMenuController al que pueda llamar para obtener este artículo?Agregar voz a UIMenuController personalizado

UIMenuItem *copyMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Copy", @"Copy menu item") action:@selector(myappCopy:)]; 

UIMenuItem *highlightMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Highlight", @"Highlight menu option") action:@selector(myappHighlight:)]; 

UIMenuItem *unhighlightMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Remove Highlight", @"Remove Highlight menu option") 
                  action:@selector(myappRemoveHighlight:)]; 

UIMenuItem *noteMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Note", @"Note menu options") action:@selector(myappNote:)]; 

[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:copyMenuItem, highlightMenuItem, unhighlightMenuItem, noteMenuItem, nil]; 

[copyMenuItem release]; 
[highlightMenuItem release]; 
[unhighlightMenuItem release]; 
[noteMenuItem release]; 

Incluso trataron de analizar los elementos del menú compartidos existentes al inicio, pero no veo nada tirado en el registro. El método se llama en el lanzamiento de la aplicación.

intentado esto en la parte superior del método:

for (UIMenuItem *menuItem in [UIMenuController sharedMenuController].menuItems) { 
     NSLog(@"title: %@", menuItem.title); 
     NSLog(@"action: %@", menuItem.action); 
    } 

Cualquier ayuda es muy apreciada! Gracias - Eric

+0

En pocas palabras ... así que descubrí que el recuento de la matriz de elementos UIMenuController es 0 al comienzo del método, por lo que el ciclo for es inútil. –

+0

Solo quiero saber si alguien sabe cómo acceder a los elementos predeterminados de UIMenuController e incluirlos en los elementos del menú. –

+0

He enviado esto como radar: 12931434. ¿Pudo obtener la aprobación de la tienda de aplicaciones con su solución a continuación? –

Respuesta

7

Algunos de los artículos de UIMenuController se pueden encontrar en UIResponder.h en UIKit framework.

@interface NSObject(UIResponderStandardEditActions) // these methods are not implemented  in NSObject 

- (void)cut:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)copy:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)paste:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)select:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)selectAll:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)delete:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2); 
- (void)makeTextWritingDirectionLeftToRight:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); 
- (void)makeTextWritingDirectionRightToLeft:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); 

@end 

Pero no hay una opción de texto hablada allí. Resulta que si anula "canPerformAction: WithSelector:", dentro de una subclase de su UIWebView o UITextField como se detalla a continuación, también obtendrá una lista de todas las acciones enviadas a self, incluidas las opciones de UIMenuController.

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

    //if you are customizing your menu, return NO except for your specific selectors 
    return YES; 
} 

Encontrará varios métodos que pueden interesar, incluyendo _accessibilitySpeak: y _accessibilityPauseSpeaking: y _define: (tenga en cuenta estos tres selectores son iOS 5 solamente). El guión bajo significa que son privados, así que tenga en cuenta que no puede llamarlos directamente con la sintaxis clásica [selector de clase].

Recuerde, estos son elementos del menú del sistema, lo que significa que Apple los colocará delante de cualquier elemento del menú que agregue, dejando a menudo los elementos del menú en una segunda capa a la que se accede presionando la flecha>. Si desea controlar el orden en que se muestran los elementos, y/o mezclar los elementos del sistema de Apple con sus artículos, deberá crear elementos de menú personalizados para estas acciones que invoquen un método en su clase como este:

- (void) myAppSpeak: (UIMenuController*) sender 
{ 
    [super performSelector:@selector(_accessibilitySpeak:)]; 
} 

Tenga en cuenta que estos métodos deben implementarse en una subclase de una clase que ya los implementa, como una subclase de UIWebView .... no una subclase de UIWebViewController.

Luego, dentro del controlador, o donde sea que construya su UIMenuController, cree el botón personalizado que llama a este método. Asegúrese de estar en una vista web, haga referencia a un objeto de tipo de su subclase y no a la vista web genérica. De lo contrario, no funcionará.

UIMenuItem *speakMenuItem = [[UIMenuItem alloc] initWithTitle:@"Speak" action:@selector(myAppSpeak:)]; 

    [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:speakMenuItem, etc. etc., nil]; 

A pesar de que va a agregar a los elementos de menú, no aparecerá a menos que devuelva SÍ para el selector en su canPerformAction: WithSelector: en la subclase de la vista web o campo de texto. Así que siéntase libre de agregar elementos aquí que pueden ser circunstanciales de lo contrario. Puede usar la lógica en su vista subclase para resolverlo.

7

He encontrado algunas cosas interesantes con este error. Básicamente, cuando la selección de hablar está habilitada, después de realizar la primera selección, el UIMenuController se vacía de menuItems. La solución, aunque hacky, es simple.

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
NSString *selectorString = NSStringFromSelector(action); 
BOOL isAccessibilitySelector = [selectorString isEqualToString:@"_accessibilitySpeak:"] || [selectorString isEqualToString:@"_accessibilityPauseSpeaking:"]; 
if (isAccessibilitySelector && [super canPerformAction:action withSender:sender]) { 
    //(re)add menuItems to UIMenuController 
    return YES; 
} 
return NO; 

}

Debo señalar que hay que volver a agregar el menuItems después de su canPerformAction...() ha sido llamado.

He enviado esto como radar: 12931434. Actualización: DUP'ed a 13060693.

Cuestiones relacionadas