L'adoption de UIKeyInput protocole pour obtenir l'entrée d'un clavier Bluetooth
J'ai un Bluetooth commutateur au pied, c'est essentiellement un clavier sans fil. Une pédale envoie la touche flèche vers le haut, l'autre envoie la flèche vers le bas. Je veux être en mesure d'exécuter mon propre code dans mon iPad app quand on de la pédale est enfoncée. Le fabricant de la pédale me dit que je dois créer un UITextField
, et d'adopter la UIKeyInput
protocole dans le contenant UIView et l'utilisation de la beginningOfDocument
et endOfDocument
méthodes d'exécuter mon code. Je l'ai fait, mais peu importe ce que je fais, aucun des UIKeyInput ou UITextInput méthodes appelées. Quelqu'un peut-il me guider à travers ce, ou me diriger vers un tutoriel sur quelque chose de semblable à cela? Est-il un moyen plus facile de faire cela?
Merci pour votre aide.
Voici mon .h:
#import <UIKit/UIKit.h>
@interface Pedal_ProtocolViewController : UIViewController <UIKeyInput, UITextInput>{
UITextField *myTextField;
}
@property (nonatomic, retain) IBOutlet UITextField *myTextField;
@end
Et voici mon .m:
#import "Pedal_ProtocolViewController.h"
@implementation Pedal_ProtocolViewController
@synthesize myTextField;
- (void)dealloc
{
[super dealloc];
}
- (void)didReceiveMemoryWarning
{
//Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
//Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
//Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[super viewDidLoad];
[myTextField canBecomeFirstResponder];
[myTextField becomeFirstResponder];
}
- (void)viewDidUnload
{
[super viewDidUnload];
//Release any retained subviews of the main view.
//e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
//Return YES for supported orientations
return YES;
}
#pragma mark -
#pragma mark UIKeyInput Protocol Methods
- (BOOL)hasText {
return NO;
}
- (void)insertText:(NSString *)theText {
}
- (void)deleteBackward {
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
#pragma mark -
#pragma mark UITextInput Protocol Methods
- (NSString *)textInRange:(UITextRange *)range {
return @"";
}
- (void)replaceRange:(UITextRange *)range withText:(NSString *)text {
}
- (void) setSelectedTextRange: (UITextRange *) range {
}
- (UITextRange *) markedTextRange {
return nil;
}
- (NSDictionary *) markedTextStyle {
return nil;
}
- (void) setMarkedTextStyle: (NSDictionary *) style {
}
- (void)setMarkedText:(NSString *)markedText selectedRange:(NSRange)selectedRange {
}
- (void) unmarkText {
}
- (UITextPosition *) endOfDocument {
//DOWN KEY
NSLog(@"Down");
return nil;
}
- (UITextPosition *) beginningOfDocument {
//UP KEY
NSLog(@"UP");
return nil;
}
- (UITextRange *)textRangeFromPosition:(UITextPosition *)fromPosition toPosition:(UITextPosition *)toPosition{
return nil;
}
- (UITextPosition *)positionFromPosition:(UITextPosition *)position offset:(NSInteger)offset{
return nil;
}
- (UITextPosition *)positionFromPosition:(UITextPosition *)position inDirection:(UITextLayoutDirection)direction offset:(NSInteger)offset {
return nil;
}
- (NSComparisonResult) comparePosition: (UITextPosition *)position toPosition: (UITextPosition *)other {
return NSOrderedSame;
}
- (NSInteger) offsetFromPosition: (UITextPosition *)from toPosition: (UITextPosition *)toPosition {
return 0;
}
- (void) setInputDelegate: (id <UITextInputDelegate>) delegate {
}
- (id <UITextInputDelegate>) inputDelegate {
return nil;
}
- (id <UITextInputTokenizer>) tokenizer {
return nil;
}
- (UITextPosition *)positionWithinRange:(UITextRange *)range farthestInDirection:(UITextLayoutDirection)direction {
return nil;
}
- (UITextRange *) characterRangeByExtendingPosition: (UITextPosition *) position inDirection: (UITextLayoutDirection) direction {
return nil;
}
- (UITextWritingDirection) baseWritingDirectionForPosition: (UITextPosition *)position inDirection: (UITextStorageDirection)direction {
return 0;
}
- (void) setBaseWritingDirection: (UITextWritingDirection)writingDirection forRange:(UITextRange *)range {
}
- (CGRect) firstRectForRange: (UITextRange *) range {
return CGRectZero;
}
- (CGRect) caretRectForPosition: (UITextPosition *) position {
return CGRectZero;
}
- (UITextPosition *) closestPositionToPoint: (CGPoint)point {
return nil;
}
- (UITextPosition *) closestPositionToPoint: (CGPoint)point withinRange: (UITextRange *) range {
return nil;
}
- (UITextRange *) characterRangeAtPoint: (CGPoint)point {
return nil;
}
- (UITextRange *) selectedTextRange {
return [[UITextRange alloc]init];
}
@end
Il y a quelques tidbits utiles à avoir dans le DCIntrospect projet sur Github. Ces gars-utilisez des sélection soignée de suivi de distinguer entre le haut, le bas, la gauche, la droite, et tous les quatre, soit avec la touche maj et option. Tout, une sacrément impressionnant effort, j'ai pensé.
OriginalL'auteur fredwardo | 2011-09-14
Vous devez vous connecter pour publier un commentaire.
Vous avez adopté le
UIKeyInput
dans leUIViewController
. Remarque l'héritage définition que vous avez entré:Que vous avez dit, "C'est un point de vue contrôleur qui implémente
UIKeyInput
etUITextInput
." Ces deux protocoles s'appliquent àUIResponder
sous-classes telles queUIView
et sous-classes ouUIView
.UIViewController
estpas une telle classepeut-être pas la meilleure classe pour gérer la saisie de texte.Vue des contrôleurs de gestion des affichages. Ils ne sont pas vues elles-mêmes.
Vous pouvez (au lieu de la saisie de texte protocoles), il suffit d'utiliser un caché champ de texte (tel que celui que vous avez déjà). Il suffit de créer une sous-classe de
NSObject
qui implémente un délégué pour le champ de texte, et de l'affecter en tant que délégué du champ de texte. Puis, dans-viewDidAppear:
, appel-becomeFirstResponder
sur le champ de texte pour se concentrer sur le terrain. Vous pouvez probablement utiliser quelques astuces pour masquer le clavier.Cette approche est couramment utilisé dans les jeux et le jeu de l'appui aux bibliothèques pour afficher le clavier logiciel. Il fonctionne même sur iOS 3.1.3 et plus tôt (ce qui n'est pas un problème pour vous, alors que vous êtes en développement pour l'iPad).
Dans le cas où vous garder cette conception (traitement des données dans la vue contrôleur), alors c'est peut-être nécessaire et de le faire fonctionner.
Faire examiner à l'aide de la
UITextField
et un délégué pour la manipulation d'entrée, ou de la mise en œuvre de ces deux fonctions et laUIKeyInput
protocole dans une sous-classe deUIView
.Notez également que vous ne sont pas tenus de se conformer aux
UITextInput
juste pour obtenir les appuis sur les touches;UIKeyInput
est assez.Supplémentaires remarque: si vous décidez de sous-classe
UIView
(qui, avec l'aide d'un cachéUITextField
, est ce que je fais; je n'ai pas essayé sous-classementUIViewController
pour obtenir l'entrée de clavier), vous souhaitez ajouter-becomeFirstResponder
à-awakeFromNib
à la place:Que si vous êtes en train de charger la
UIViewController
(et donc laUIView
) à partir d'une plume. Ne pas le faire? Essayez d'ajouter que, dans-initWithFrame:
:Alternativement, dans des UIViewController de
viewDidLoad
:Il y a évidemment des charges de façons dont vous pouvez faire cette. 😉
UIViewController
est une sous-classe deNSResponder
. developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/...UIResponder. Eh bien, mon mauvais 🙂 je ne suis pas sûr que ça devrait devenir le premier intervenant. Mais il semble que c'est ce que la question demandeur n'a pas fait. Je vais mettre à jour ma réponse.
Le hic, cependant, c'est que je ne crois pas qu'une vue contrôleur peut devenir le premier intervenant, de sorte que vous n'aurez probablement encore besoin de sous-classe
UIView
, mais vous aurez aussi explicitement d'avoir à faire le premier intervenant pour déclencher la fonctionnalité du clavier.Quand j'ai vu votre commentaire, c'est la première chose qui m'est venu dans mon esprit, "un point de vue contrôleur ne peut probablement pas être un "first responder". Mais, je pense que la seule vérification de UIKit n'est de demander à un
UIResponder
si elle peut devenir un des premiers intervenants. Sans tester, je crois que la solution ci-dessus (en ignorant-canBecomeFirstResponder
, ce qui est nécessaire pourUIView
) doit être correcte. Aussi, légèrement mise à jour de la réponse.Ouais, je suis assez d'un nerd, je suis allé et l'a testé. Je ne pouvais pas obtenir le point de vue du contrôleur pour devenir intervenant de première ligne, mais une sous-classe UIView a fonctionné comme prévu.
OriginalL'auteur Ivan Vučica
Voir la solution que j'ai développée pour répondre à des touches fléchées à partir d'une pédale de commande:
Comment puis-je répondre à l'externe des touches fléchées du clavier?
OriginalL'auteur colincameron
dans IOS 7, il est facile. Dans les versions précédentes - non officiel. Peut être retiré de l'App Store.
Cela fonctionne pour moi, espérons, seront utiles pour vous. Ajoutée, contrôle de version, pour éviter l'utilisation non-iOS7 appareils.
OriginalL'auteur ETech