Code Snips Respond to Keyboard Presses

// Written by Jordan Morgan // Apr 14th, 2021 // Read it in about 1 minute

let concatenatedThoughts = """

Welcome to Snips! Here, you'll find a short, fully code complete sample with two parts. The first is the entire code sample which you can copy and paste right into Xcode. The second is a step by step explanation. Enjoy!

"""

The Scenario

Add support for keyboard presses in your app.

import UIKit

class KeyboardViewController: UIViewController {
    
}

// MARK: Keyboard Shortcuts
extension KeyboardViewController {
	// 1
    override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
        super.pressesBegan(presses, with: event)
        // 2
        presses.first?.key.flatMap{ onKeyPressed($0) }
    }
    
    // 3
    func onKeyPressed(_ key: UIKey) {
        switch key.keyCode {
        case .keyboardSpacebar:
            print("On spacebar pressed")
        case .keyboardN where key.modifierFlags.contains(.command):
            print("On N + Command pressed")
        default:
            break
        }
    }
}

The Breakdown

Step 1
Override touch handling events to respond to keyboard presses such as pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?). In addition, you can also respond to its similar variants such as pressesCancelled or pressesEnded.

Step 2
Since the set of UIPress objects will hold an instance of UIKey?, we flatMap out any nil instance since the touch event is not exclusive to keyboard presses.

Step 3
Finally, we can switch on the UIKey’s keyCode property to respond to the ones we are interested in. Further, you can tack on a where clause to handle complex key press combinations.

Unlike adding keyboard shortcuts, this technique is great for adhoc responses to the keyboard where it wouldn’t make sense to register a UIKeyCommand for the things you’re trying to do (i.e. move a character in a video game by using the W,A,S and D keys.).

Until next time ✌️

Spot an issue, anything to add?

Open a pull request →