Nitesh Nitesh - 5 months ago 119
Swift Question

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?

Answer

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(_:)) {
     return true
   }
   if action == #selector(customMethod(_:)) {
     return true
   }
   ...
   return false
 }