NEW! Pre-order my latest book, Testing Swift! >>

How to create custom menus using UIMenuController

Paul Hudson       @twostraws

iOS has a built-in menu system that, while useful, doesn't actually get much use – because users don't expect to see it, developers don't use it, thus making it even less likely that users expect to see it.

Anyway, if you want to attach multiple actions to elements in your UI – pieces of text in a text view or web view, table view rows, and so on – you might find iOS menus are for you, so you need to turn to UIMenuController. This has extremely simple API: you just create a UIMenuItem object for every action you want, then register them all and wait for the user to do something.

Below is a complete example for a view controller that has a web view inside it – you'll need to create that in your storyboard. The code sets up a new menu item named "Grok" that runs the runGrok() method when tapped. I've made it do something real: when the user selects some text, they tap Grok to have that printed out to the Xcode console.

Here's the code:

class ViewController: UIViewController, UITextViewDelegate {
    @IBOutlet var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        webView.loadHTMLString("<p>Hello, world!</p>", baseURL: nil)
        enableCustomMenu()
    }

    func enableCustomMenu() {
        let lookup = UIMenuItem(title: "Grok", action: #selector(runGrok))
        UIMenuController.shared.menuItems = [lookup]
    }

    func disableCustomMenu() {
        UIMenuController.shared.menuItems = nil
    }

    @objc func runGrok() {
        let text = webView.stringByEvaluatingJavaScript(from: "window.getSelection().toString();")
        print(text)
    }
}

Available from iOS 3.0

Did this solution work for you? Please pass it on!

Other people are reading…

About the Swift Knowledge Base

This is part of the Swift Knowledge Base, a free, searchable collection of solutions for common iOS questions.

Go from iOS to macOS the easy way!

If you like Hacking with Swift, you'll love Hacking with macOS – learn to build macOS apps today, using 18 real-world projects!

MASTER SWIFT NOW
Buy Practical iOS 12 Buy Pro Swift Buy Swift Design Patterns Buy Practical iOS 11 Buy Swift Coding Challenges Buy Server-Side Swift (Vapor Edition) Buy Server-Side Swift (Kitura Edition) Buy Hacking with macOS Buy Advanced iOS Volume One Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with Swift Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let me know!

Click here to visit the Hacking with Swift store >>