Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect keyboard events on hardware keyboard on iPhone (iOS)

I have an app with a login page that has three fields for three different random characters. When the user leaves the last field, the soft keyboard disappears and the user can touch a "login" button on screen.

When there is a hardware keyboard (bluetooth or physical) attached, I'd like to be able to hit "enter" on it. However because the user is not in a field, I can't see how to detect this key being pressed.

Would anyone have advice on which class handles key press events? Presumably there is a delegate that I can use to receive these but my searches through the SDK haven't found anything.

Thanks

like image 309
hocker Avatar asked Dec 04 '22 11:12

hocker


2 Answers

For iOS 7.0 or later, you can return UIKeyCommands for the keyCommands property from any UIResponder, such as UIViewController:

Objective-C

// In a view or view controller subclass:
- (BOOL)canBecomeFirstResponder
{
    return YES;
}

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

- (void)enterPressed
{
    NSLog(@"Enter pressed");
}

Swift

// In a UIView/UIViewController subclass:
override var canBecomeFirstResponder: Bool {
    true
}

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

@objc func enterPressed() {
    print("Enter pressed")
}
like image 62
Patrick Pijnappel Avatar answered Jan 12 '23 00:01

Patrick Pijnappel


One way to accomplish this is to have a hidden extra (4th in your case) text field. Make it 1x1 px in size and transparent. Then make it the first responder when any of your other 3 text fields are not, and look for text change events in that hidden field to trigger your key input event.

You might also want to check the notification for a software keyboard appearing if you don't want it to stay visible as well.

like image 39
hotpaw2 Avatar answered Jan 11 '23 22:01

hotpaw2