Как определить события клавиатуры на аппаратной клавиатуре на iPhone (iOS)

У меня есть приложение со страницей входа, в которой есть три поля для трех разных случайных символов. Когда пользователь покидает последнее поле, программная клавиатура исчезает, и пользователь может нажать кнопку «Войти» на экране.

Когда подключена аппаратная клавиатура (bluetooth или физическая), я хотел бы иметь возможность нажимать на ней "ввод". Однако, поскольку пользователь не находится в поле, я не вижу, как определить нажатие этой клавиши.

Может ли кто-нибудь посоветовать, какой класс обрабатывает события нажатия клавиш? Предположительно, есть делегат, которого я могу использовать для их получения, но мои поиски через SDK ничего не нашли.

Спасибо


person hocker    schedule 15.09.2010    source источник


Ответы (3)


Один из способов добиться этого - создать скрытое дополнительное (четвертое в вашем случае) текстовое поле. Сделайте его прозрачным и размером 1x1 пикселей. Затем сделайте его первым респондентом, когда какое-либо из ваших других 3 текстовых полей нет, и поищите события изменения текста в этом скрытом поле, чтобы вызвать событие ключевого ввода.

Вы также можете проверить уведомление о появлении программной клавиатуры, если вы не хотите, чтобы она также оставалась видимой.

person hotpaw2    schedule 15.09.2010
comment
Эй, у вас есть пример кода, как это будет работать? Особенно как я скрываю клавиатуру за скрытым текстовым полем. - person Sebastian Wramba; 28.10.2010

Для iOS 7.0 или новее вы можете вернуть UIKeyCommands для свойства keyCommands из любого UIResponder, например UIViewController:

Цель-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")
}
person Patrick Pijnappel    schedule 03.03.2014
comment
Это переопределит любые другие поля ввода текста. - person Oliver Dixon; 10.07.2018
comment
Вы знаете, можно ли получить тип события? keyUp keyDown? - person calmar; 11.05.2020
comment
см. здесь: stackoverflow.com/a/61312598/7487013 - person MrStahlfelge; 07.07.2020

В продолжение ответа @Patrick вот как вы это делаете в Xamarin.iOS:

public override bool CanBecomeFirstResponder
{
    get { return true; }
}

public override UIKeyCommand[] KeyCommands
{
    get
    {
         return new[]{ UIKeyCommand.Create((NSString)"\r", (UIKeyModifierFlags)0, new ObjCRuntime.Selector("enterPressed")) };
    }
}

[Export("enterPressed")]
private void OnEnterPressed()
{
    // Handle Enter Key
}
person Kraig McConaghy    schedule 05.02.2015
comment
Имейте в виду, что это переопределит любой другой ввод текста в приложении. - person Oliver Dixon; 10.07.2018