Как удалить «Копировать», «Выбрать все», «Определить элемент меню» из UIMenuController

Поскольку мой этот вопрос отображается, я хочу отображать всплывающее окно, когда пользователь выбирает текст. и в этом всплывающем окне будут отображаться подробности об этом слове.

Но я не получил удовлетворительного ответа, поэтому я изменил свою логику.

Теперь я хочу отобразить один элемент, например Pop-Up, в моем UIMenuController, и когда пользователь нажмет эту опцию, появится всплывающее окно.

Я достиг этого, используя этот код,

UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Pop-Up" action:@selector(displayPopUp:)];
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];

Итак, моя опция отображается, и когда я нажимаю эту опцию, отображается всплывающее окно. Но также отображается какая-то другая опция, которую я не хочу, например

введите здесь описание изображения

Я погуглил и получил этот код

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

{    
[UIMenuController sharedMenuController].menuVisible = NO; //do not display the menu
if (action == @selector(copy:))
{

    return NO;  

}

else  if (action == @selector(selectAll:))
{
    return NO; 

}

[self resignFirstResponder];                      //do not allow the user to selected anything
return NO;

return [super canPerformAction:action withSender:sender];
}

Но он не удалил этот дополнительный элемент в UIMenuController.


person Community    schedule 02.07.2013    source источник
comment
Отредактируйте предыдущий вопрос, чтобы внести больше ясности, а не создавать слегка измененный новый вопрос.   -  person Amar    schedule 02.07.2013
comment
@ Амар, я с тобой не согласен. bcoz, как я вижу, весь его вопрос изменен как небольшое логическое изменение, так что все в порядке.   -  person Dilip    schedule 02.07.2013


Ответы (1)


Метод canPerformAction отправляется всем в цепочке Responder. Итак, если код, который вы упомянули выше, находится в ViewController, но UITextView является первым ответчиком, он не будет работать. Я обнаружил, что проще всего было создать подкласс UITextView и поместить туда код canPerformAction. Я отключаю все элементы меню по умолчанию и создаю собственное меню.

class rtfView: UITextView {

override func canPerformAction(_ action: Selector, withSender sender: Any!) -> Bool {

    if (action == #selector(textItem(_:))) || (action == #selector(h1Item(_:))) || (action == #selector(h2Item(_:))) || (action == #selector(h3Item(_:))) {
        return true
    } else {
        return false
    }

}

}

person profRic    schedule 12.03.2017