2012-03-26 11 views
7

पर भाषण जोड़ना मैंने UIWebView में एक कस्टम UIMenuController बनाया है, लेकिन इसके बाद UIMenuController में "स्पीक चयन" विकल्प से छुटकारा पाता है। स्पीच चयन विकल्प सभी परीक्षण उपकरणों पर वरीयताओं में चालू है और यह गैर-ऐप्पल ऐप्स सहित अन्य ऐप्स में दिखाई देता है। क्या कोई एक्सेसिबिलिटी सेवा या 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 है, इसलिए लूप व्यर्थ है। –

+0

मैं सिर्फ जानना चाहता हूं, क्या कोई जानता है कि डिफ़ॉल्ट UIMenuController आइटमों को कैसे एक्सेस करें और उन्हें अपने मेनू आइटम में शामिल करें? –

+0

मैंने इसे रडार के रूप में सबमिट किया है: 12 9 31434। क्या आप नीचे अपने समाधान के साथ ऐप-स्टोर स्वीकृति प्राप्त करने में सक्षम थे? –

उत्तर

7

कुछ यूआईएमएनयू कंट्रोलर आइटम UIKit फ्रेमवर्क में UIResponder.h में पाए जा सकते हैं।

@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 हैं केवल)। अंडरस्कोर का अर्थ है कि वे निजी हैं, इसलिए यह भी ध्यान रखें कि आप उन्हें क्लासिक [क्लास चयनकर्ता] वाक्यविन्यास के साथ सीधे कॉल नहीं कर सकते हैं।

याद रखें, ये सिस्टम मेनू हैं, इसका मतलब है कि ऐप्पल उन्हें आपके द्वारा जोड़े गए किसी भी मेनू आइटम के सामने चिपकेगा, अक्सर आपके मेनू आइटम को तीर टैप करके एक्सेस की गई दूसरी परत में छोड़ देगा। यदि आप ऑर्डर को नियंत्रित करना चाहते हैं जिसमें आइटम प्रदर्शित होते हैं, और/या ऐप्पल के सिस्टम आइटम को अपने आइटम के साथ मिश्रित करना चाहते हैं, तो आपको इन क्रियाओं के लिए कस्टम मेनू आइटम बनाना होगा जो आपकी कक्षा में एक विधि को कॉल करते हैं:

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

ध्यान रखें कि इन तरीकों को कक्षा के उप-वर्ग में कार्यान्वित करने की आवश्यकता है जो इन्हें पहले से लागू करता है, जैसे UIWebView की उप-वर्ग .... UIWebViewController का उप-वर्ग नहीं।

फिर नियंत्रक के अंदर, या जहां भी आप अपना UIMenuController बनाते हैं, इस विधि को कॉल करने वाले कस्टम बटन बनाएं। सुनिश्चित करें कि आप वेब व्यू में हैं, तो आप अपने उप-वर्ग के प्रकार की ऑब्जेक्ट का संदर्भ दे रहे हैं, न कि सामान्य वेबव्यू। अन्यथा, यह काम नहीं करेगा। WithSelector: अपने वेब दृश्य या पाठ क्षेत्र के अपने उपवर्ग में

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

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

भले ही आप इसे अपने मेनू आइटम के लिए जोड़ रहे हैं, यह जब तक आप अपने canPerformAction में चयनकर्ता के लिए हाँ वापसी दिखाई नहीं देगा। तो यहां वस्तुओं को जोड़ने में संकोच न करें जो अन्यथा परिस्थितित्मक हो सकते हैं। आप इसे सुलझाने के लिए अपने उप-वर्गीकृत दृश्य में तर्क का उपयोग कर सकते हैं।

7

मुझे इस बग के साथ कुछ दिलचस्प चीजें मिली हैं। असल में, जब चयन का चयन सक्षम होता है, तो पहला चयन करने के बाद UIMenuControllermenuItems से खाली हो जाता है। समाधान, हालांकि हैकी, सरल है।

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

}

मैं नोट करना चाहिए कि आप चाहिए menuItems उनके canPerformAction...() बुलाया गया है के बाद पुन: जोड़ें।

मैंने इसे रडार के रूप में सबमिट किया है: 12 9 31434। अद्यतन: 13060693 पर DUP'ed।

संबंधित मुद्दे