2011-11-05 93 views
5

我建立我自己的自定義編輯菜單(UIMenuController)和「定義」編輯菜單項現在用的是典型的選擇在iOS 5中

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

方法有條件地啓用/禁用系統默認值。典型的編輯方法有很好的文檔記錄(copy :, cut :,等等),但是我找不到任何有關「Define」菜單選項調用什麼方法來提取iOS 5中的新單詞詞典的問題。也許它是隱藏在明顯的視野中,但我花了數小時尋找它,所以我會很感激任何幫助。具體而言,我需要:

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

但給我真正進去的地方「defineWord:」

PS - 我不會介意知道該方法屬於什麼類的,只是出於好奇(副本:屬於UIResponderStandardEditActions,例如)

回答

5

通過實施這樣的:

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

我能看到的是,選擇是 「_define:」。

+0

感謝,雙方的回答,你是如何得到它(一個有用的技巧)! ! – Michael

+1

我的應用因爲_define:而被拒絕。解析中心表示原因是「2.5:使用非公開API的應用程序將被拒絕」。 – tokentoken

5

定義選擇器(_define :)實際上是私人的,如果您使用它,您的應用程序將被拒絕。我不得不這樣做只得到定義菜單項中的一個UITextView展現出來是這樣的:

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

你說的沒錯 - 昨天我收到了我的拒絕信,而我並沒有真正感到驚訝,因爲我可以告訴它是私人的(Xcode抱怨)。現在,我只是禁用了代碼並刪除了Define選項,我將在下一個版本中嘗試一下上面的變體。 – Michael

+0

@Michael Surran你如何刪除define而不使用_define選擇器? – CedricSoubrie

+0

基本上我想要使用(BOOL)canPerformAction:(SEL)動作與Sender(id)發件人編輯菜單項返回YES。對於其他所有內容(包括_define選擇器),我將返回NO。 – Michael

0

在iOS系統7.1我看到覆蓋上的UIWebView一個子類的canPerformAction:withSender:方法時出現的這些動作:

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

大概以下劃線爲前綴的是「私人API」,它們的使用會讓您的應用遭到App Store的拒絕。但是,我無法真正在這種或那種方式上找到任何文檔。

沒有下劃線的那些被定義爲UIResponderStandardEditActions非正式協議的一部分。

0

簡單的方法來做到這一點,而無需使用privateAPI,只返回心思動

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

享受YES;)