2012-03-26 13 views
7

Ich habe eine benutzerdefinierte UIMenuController in einer UIWebView erstellt, aber es scheint die "Speak Selection" -Option in der UIMenuController danach loszuwerden. Die Sprachauswahloption ist in den Einstellungen auf allen Testgeräten aktiviert und wird in anderen Apps, einschließlich Apps anderer Hersteller, angezeigt. Gibt es einen Zugänglichkeitsdienst oder Teil der sharedMenuController, die ich anrufen kann, um diesen Artikel zu bekommen?Hinzufügen von Sprache zu benutzerdefinierten UIMenuController

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]; 

Ich habe sogar versucht, die bestehenden gemeinsamen Menüpunkte am Anfang zu analysieren, aber ich etwas nicht im Protokoll abgeladen sehen. Die Methode wird beim Start der App aufgerufen.

das an der Spitze der Methode versucht:

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

Jede Hilfe sehr geschätzt wird! Danke - Eric

+0

Bottom line ... also habe ich herausgefunden, dass die Anzahl der UIMenuController Items Array 0 am Anfang der Methode ist, so dass die For-Schleife sinnlos ist. –

+0

Ich möchte nur wissen, weiß jemand, wie Sie auf die UIMenuController-Standardelemente zugreifen und sie in Ihre Menüelemente aufnehmen? –

+0

Ich habe dies als Radar eingereicht: 12931434. Konnten Sie mit Ihrer Lösung die App-Store-Genehmigung erhalten? –

Antwort

7

Einige der UIMenuController-Elemente können in UIResponder.h im UIKit-Framework gefunden werden.

@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 

Aber es gibt keine sprechen Textoption dort. Es stellt sich heraus, wenn Sie "canPerformAction: WithSelector:" außer Kraft setzen, innerhalb einer Unterklasse Ihres UIWebView oder UITextField, wie unten aufgeführt, erhalten Sie auch eine Auflistung aller an self gesendeten Aktionen einschließlich der UIMenuController-Optionen.

// 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; 
} 

Sie werden verschiedene Methoden, die Sie, einschließlich _accessibilitySpeak interessieren könnten: und _accessibilityPauseSpeaking: und _define: (bitte beachten Sie, diese drei Selektoren sind nur iOS 5). Der Unterstrich bedeutet, dass sie privat sind, also bedenken Sie auch, dass Sie sie nicht direkt mit der klassischen Syntax [Klassenselektor] aufrufen können.

Denken Sie daran, dies sind Systemmenüpunkte, was bedeutet, dass Apple sie vor jedem Menüeintrag, den Sie hinzufügen, anheftet. Oft verlassen Sie Ihre Menüeinträge in einer zweiten Ebene, indem Sie auf den Pfeil> tippen. Wenn Sie die Reihenfolge, in der die Elemente angezeigt werden, steuern und/oder Apple-Systemelemente mit Ihren Elementen mischen möchten, müssen Sie benutzerdefinierte Menüelemente für diese Aktionen erstellen, die eine Methode in Ihrer Klasse wie folgt aufrufen:

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

Beachten Sie, dass diese Methoden in einer Unterklasse einer Klasse implementiert werden müssen, die diese bereits implementiert, z. B. eine Unterklasse von UIWebView .... keine Unterklasse von UIWebViewController.

Dann erstellen Sie im Controller oder wo immer Sie Ihren UIMenuController erstellen, die benutzerdefinierte Schaltfläche, die diese Methode aufruft. Stellen Sie sicher, dass Sie in einer Webansicht auf ein Objekt vom Typ Ihrer Unterklasse und nicht auf die generische Webansicht verweisen. Andernfalls wird es nicht funktionieren.

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

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

Auch wenn Sie es auf die Ihre Menüpunkte hinzufügen, wird es nicht angezeigt, wenn Sie JA für die Wähler in Ihrem canPerformAction zurück: WithSelector: in der Unterklasse Ihrer Web-Ansicht oder Textfeld ein. Fühlen Sie sich also frei, hier Dinge hinzuzufügen, die sonst umständlich sein könnten. Sie können Logik in Ihrer untergeordneten Ansicht verwenden, um das zu sortieren.

7

Ich habe einige interessante Dinge mit diesem Fehler gefunden. Grundsätzlich, wenn die Sprachauswahl aktiviert ist, wird nach der ersten Auswahl die UIMenuController von menuItems geleert. Die Lösung, obwohl hacky, ist einfach.

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

}

Ich sollte anmerken, dass Sie die menuItems nach erneut hinzufügen müssen ihre canPerformAction...() aufgerufen wurde.

Ich habe dies als Radar eingereicht: 12931434. Update: DUP auf 13060693.

Verwandte Themen