17

Anyone know how to detect the "delete" key using UIKeyCommand on iOS 7?

Jordan H
  • 52,571
  • 37
  • 201
  • 351
Scotty
  • 2,019
  • 1
  • 20
  • 31

4 Answers4

33

As people were having problems with Swift, I figured a small, complete example in both Objective C and Swift might be a good answer.

Note that Swift doesn't have a \b escape character for backspace, so you need to use a simple Unicode scalar value escape sequence of \u{8}. This maps to the same old-school ASCII control character number 8 ("control-H", or ^H in caret notation) for backspace as \b does in Objective C.

Here's an Objective C view controller implementation that catches backspaces:

#import "ViewController.h"

@implementation ViewController

// The View Controller must be able to become a first responder to register
// key presses.
- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (NSArray *)keyCommands {
    return @[
        [UIKeyCommand keyCommandWithInput:@"\b" modifierFlags:0 action:@selector(backspacePressed)]
    ];
}

- (void)backspacePressed {
    NSLog(@"Backspace key was pressed");
}

@end

And here's the equivalent view controller in Swift:

import UIKit

class ViewController: UIViewController {

    override var canBecomeFirstResponder: Bool {
        return true;
    }

    override var keyCommands: [UIKeyCommand]? {
        return [
            UIKeyCommand(input: "\u{8}", modifierFlags: [], action: #selector(backspacePressed))
        ]
    }

    @objc func backspacePressed() {
        NSLog("Backspace key was pressed")
    }

}
Matt Gibson
  • 37,886
  • 9
  • 99
  • 128
  • Type 'UIKeyModifierFlags' has no member 'allZeros' – purefusion Mar 23 '18 at 16:53
  • @purefusion I have now updated the code to work with the very latest version of Swift. Key differences: `canBecomeFirstResponder` and `keyCommands` are now overridden properties, not methods, `modifierFlags` is now an `OptionSet` so you can pass an empty set if there are no modifiers rather than use the `allZeros` kludge, and I'm using the new `#selector` syntax. Tested and working fine with an external keyboard. – Matt Gibson Mar 23 '18 at 20:08
18

Simple really - need to look for the backspace character "\b"

Scotty
  • 2,019
  • 1
  • 20
  • 31
  • 4
    This didn't work for me. It states "invalid escape sequence". So I changed it to `"\\b"` but this results in the method not getting called upon hitting "delete" on the Mac keyboard. `UIKeyCommand(input: "\\b", modifierFlags: nil, action: "methodToCall:")` – Jordan H Dec 07 '14 at 21:59
  • I found it. Use "\\" in Swift. – Gustaf Rosenblad Dec 16 '14 at 10:47
  • 3
    @Joey try `\u{08}` instead of `\\b` – Mika May 07 '18 at 12:03
0

As of iOS 15 there is a UIKeyCommand.inputDelete constant that works:

UIKeyCommand(title: "Delete Widget",
             action: #selector(WidgetViewController.deleteWidget(_:)),
             input: UIKeyCommand.inputDelete)
Josh Justice
  • 21,186
  • 3
  • 25
  • 20
-2

You can always try UIKeyInput. https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIKeyInput_Protocol/index.html#//apple_ref/occ/intfm/UIKeyInput/deleteBackward

The function should be

- (void)deleteBackward

Tolgab
  • 1
  • 3