Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to create Custom UIMenuController with only custom items other than default?

I have requirement to show menu items on uiwebview whenever user selects any text. enter image description here

I have tried

let highlightMenuItem = UIMenuItem(title: "Highlight", action: #selector(ViewController.hightlight))

UIMenuController.sharedMenuController().menuItems = [highlightMenuItem]

but this only appends more menu item with default existing one. as this

enter image description here enter image description here

Is there any way out to achieve this with only menu items Copy, Highlight and Note?

like image 840
Nitesh Avatar asked Jun 21 '16 13:06

Nitesh


1 Answers

You can achieve this by subclassing UIWebView and overriding canPerformAction (Swift 3). Then, all you need to do is return false for whichever actions you want disabled.

Example:

class EditedUIMenuWebView: UIWebView {

  override func canPerformAction(_ action: Selector, withSender sender: AnyObject?) -> Bool {
    if action == #selector(cut(_:)) {
      return false
    }
    if action == #selector(paste(_:)) {
      return false
    }
    if action == #selector(select(_:)) {
      return false
    }
    if action == #selector(selectAll(_:)) {
      return false
    }
    ...

    return super.canPerformAction(action, withSender: sender)
  }

}

If you have any questions please ask!

Edit If you want to disable all actions but a few it may be easier to just return false in canPerformAction and return true for the ones you want like so:

override func canPerformAction(_ action: Selector, withSender sender: AnyObject?) -> Bool {
   if action == #selector(copy(_:)) || action == #selector(customMethod(_:)) {
     return true
   }
   ...
   return false
 }
like image 52
Ike10 Avatar answered Oct 05 '22 21:10

Ike10