Селектор для пункта меню "Определить" в iOS 5

5 Michael [2011-11-05 19:03:00]

Я создаю свое собственное меню редактирования (UIMenuController) и использую типичный

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

для условного включения/отключения системных значений по умолчанию. Типичные методы редактирования хорошо документированы (копия:, cut:, и т.д.), Но я не могу найти ничего о том, какой метод вызывается с помощью опции меню "Определить", чтобы поднять новый словарь слов в iOS 5. Возможно, это прячась на виду, но я много часов искал его, поэтому я был бы признателен за любую помощь. В частности, мне нужно:

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

но дайте мне то, что действительно идет на место "defineWord:"

ps - Я бы не прочь узнать, к какому классу относится этот метод, просто из любопытства (копия: относится к UIResponderStandardEditActions, например)

dictionary definition ios selector


4 ответа


5 Richard Poirier [2011-12-15 04:07:00]

Селектор define (_define:) фактически является приватным, и ваше приложение будет отклонено, если вы его используете. То, что мне нужно было сделать, чтобы получить только пункт меню 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];
}

5 Jeremy [2011-11-13 05:22:00]

Используя это:

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

Мне удалось увидеть, что селектор "_define:".


0 Basil Bourque [2014-11-15 08:42:00]

В iOS 7.1 я вижу эти действия, возникающие при переопределении метода canPerformAction:withSender: в подклассе UIWebView:

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

Предположительно те, которые имеют префикс с подчеркиванием, - это "частный API", использование которого подвергает ваше приложение отклонению от App Store. Но я не могу найти какую-либо документацию на том или ином пути.

Символы без подчеркивания определяются как часть неофициального протокола UIResponderStandardEditActions.


0 inso [2016-03-15 18:06:00]

Простой способ сделать это без использования privateAPI, вернуть YES только для желаемого действия

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

Наслаждайтесь;)