2012-03-26 233 views
7

我在UIWebView中創建了自定義UIMenuController,但在此之後它似乎擺脫UIMenuController中的「說話選擇」選項。說話選擇選項在所有測試設備上的「首選項」中打開,並出現在其他應用程序中,包括非Apple應用程序。有沒有無障礙服務或sharedMenuController的一部分,我可以打電話來獲得這個項目?將語音添加到自定義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]; 

我甚至試圖在開始時解析現有的共享菜單項,但我沒有看到任何東西傾倒在日誌中。該方法在應用程序啓動時被調用。

在方法的頂部試過這樣:

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

任何幫助,非常感謝!謝謝 - 埃裏克

+0

底線......所以我發現在方法開始時UIMenuController項目數組的數量爲0,所以for循環毫無意義。 – 2012-03-27 14:42:32

+0

我只想知道,有誰知道如何訪問默認的UIMenuController項目並將它們包含在菜單項中? – 2012-03-27 14:43:03

+0

我已將此作爲雷達提交:12931434。您是否可以通過下面的解決方案獲得應用商店的批准? – 2012-12-24 16:27:47

回答

7

一些UIMenuController項目可以在UIResponder.h在UIKit框架中。

@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 

但是這裏沒有說話的文字選項。事實證明,如果在下面列出的UIWebView或UITextField的子類中覆蓋「canPerformAction:WithSelector:」,您還將獲得發送給自己的所有操作(包括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; 
} 

你會發現幾種方法,您可能會感興趣,包括_accessibilitySpeak:和_accessibilityPauseSpeaking:和_define:(請注意這三個選擇是iOS 5中只)。下劃線表示它們是私有的,所以也要記住,你不能用經典的[類選擇器]語法直接調用它們。

請記住,這些都是系統的菜單項,這意味着蘋果將他們堅持在您添加任何菜單項的前面,常常留在通過點擊箭頭>訪問的第二層的菜單項。如果您想要控制項目的顯示順序和/或將Apple系統項目與項目混合在一起,則需要爲這些操作創建自定義菜單項,這些操作調用類中的方法,如下所示:

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

請記住,這些方法都需要在已經實現了這些類,的一個子類來實現,例如一個子類的UIWebView的.... UIWebViewController的不是一個子類別。

然後,控制器,或任何你建立你UIMenuController中,創建調用此方法的自定義按鈕。確定如果你在網絡視圖中,你引用了一個你的子類類型的對象,而不是通用的webview。否則,它將無法正常工作。 WithSelector:在你的Web視圖或文本字段的子類

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

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

即使你將它添加到您的菜單項,它不會,除非你在你的canPerformAction選擇返回YES出現。所以請隨時在這裏添加可能情況相反的項目。你可以在你的子類視圖中使用邏輯來排序。

7

我發現這個bug有一些有趣的事情。基本上,當啓用說話選擇時,在做出第一個選擇之後,UIMenuController被清空menuItems。這個解決方案儘管很簡單,但很簡單。

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

}

我要指出,你必須自己canPerformAction...()被稱爲後重新添加menuItems

我已經提交這個雷達:12931434。更新:DUP爲13060693