2010-09-15 5 views
2

J'ai une application avec une page de connexion qui a trois champs pour trois caractères aléatoires différents. Lorsque l'utilisateur quitte le dernier champ, le clavier logiciel disparaît et l'utilisateur peut appuyer sur un bouton "login" à l'écran.Comment détecter les événements de clavier sur un clavier matériel sur iPhone (iOS)

Quand il y a un clavier matériel (bluetooth ou physique) attaché, j'aimerais pouvoir appuyer sur "enter". Cependant, étant donné que l'utilisateur n'est pas dans un champ, je ne vois pas comment détecter cette touche.

Quelqu'un aurait-il des conseils sur quelle classe gère les événements de presse clés? Vraisemblablement, il y a un délégué que je peux utiliser pour les recevoir, mais mes recherches dans le SDK n'ont rien trouvé.

Merci

Répondre

1

Une façon d'y parvenir est d'avoir un supplémentaire (4 dans votre cas) caché champ de texte. Faites-le 1x1 px en taille et transparent. Ensuite, faites-en le premier répondeur lorsque l'un de vos trois autres champs de texte ne le sont pas, et recherchez les événements de changement de texte dans ce champ masqué pour déclencher votre événement d'entrée de clé.

Vous pouvez également vérifier la notification d'apparition d'un clavier logiciel si vous ne souhaitez pas qu'il reste également visible.

+0

Convenu. C'est une bonne idée. Merci. – hocker

+0

Hey, avez-vous un exemple de code de la façon dont cela fonctionnerait? Surtout comment je cache le clavier pour le champ de texte caché. –

12

Pour iOS 7.0 ou version ultérieure, vous pouvez retourner UIKeyCommands pour la propriété keyCommands de toute UIResponder, comme 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 func canBecomeFirstResponder() -> Bool { 
    return true 
} 

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

@objc func enterPressed() { 
    print("Enter pressed") 
} 
1

Comme un suivi à la réponse par @Patrick, voici comment vous le faites dans 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 
}