采用UIKeyInput协议从蓝牙键盘获取input

我有一个蓝牙脚踏开关,基本上是一个无线键盘。 一个踏板发送上箭头键,另一个发送下箭头键。 我希望能够在按下其中一个踏板时在我的iPad应用程序中执行自己的代码。 踏板的制造者告诉我,我应该创build一个UITextField ,并在包含UIView中采用UIKeyInput协议,并使用beginningOfDocumentendOfDocument方法来执行我的代码。 我这样做了,但不pipe我做什么,都没有调用UIKeyInput或UITextInput方法。 任何人都可以通过这个来引导我,或者直接给我一个类似于这个的教程? 有没有更简单的方法来做到这一点?

谢谢你的帮助。

这是我的.h:

 #import <UIKit/UIKit.h> @interface Pedal_ProtocolViewController : UIViewController <UIKeyInput, UITextInput>{ UITextField *myTextField; } @property (nonatomic, retain) IBOutlet UITextField *myTextField; @end 

这是我的.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. // eg 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 

你已经在UIViewController采用了UIKeyInput 。 请注意您input的inheritance定义:

 @interface Pedal_ProtocolViewController : UIViewController <UIKeyInput, UITextInput>{ 

你在这里说过:“这是一个实现UIKeyInputUITextInput的视图控制器。 这两个协议适用于UIResponder子类,如UIView和子类或UIViewUIViewController 不是一个这样的类,也许不是处理文本input的最好的类。

视图控制器pipe理视图。 他们不是自己的看法。

你可以(而不是文本input协议)只使用一个隐藏的文本字段(如你已经有的)。 只需创buildNSObject的子类,实现文本字段的委托,并将其指定为文本字段的委托。 然后,在-viewDidAppear: ,调用文本字段上的-becomeFirstResponder来关注该字段。 你可以使用一些黑客来隐藏键盘。

这种方法通常用于游戏和支持游戏的库中以显示软件键盘。 它甚至适用于iOS 3.1.3及更早版本(考虑到您正在为iPad开发,这对您来说不是问题)。


如果你将保持这种devise(在视图控制器中处理input),那么这可能是必需的,并使其工作。

 -(BOOL)canBecomeFirstResponder { return YES; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self becomeFirstResponder]; } 

请考虑使用UITextField和委托来处理input,或者在UIView的子类中实现上述两个函数和UIKeyInput协议。

另外请注意,您不需要遵循UITextInput来获取按键; UIKeyInput就够了。


额外的注意事项:如果你决定UIView (其中,使用隐藏的UITextField ,是我做的;我没有尝试-becomeFirstResponder UIViewController来获取键盘input),你将需要添加-becomeFirstResponder-awakeFromNib

 -(void)awakeFromNib { [super awakeFromNib]; [self becomeFirstResponder]; } 

这就是如果你从一个笔尖加载UIViewController (以及UIView )。 不这样做? 尝试添加在-initWithFrame: ::

 -(id)initWithFrame:(CGFrame)frame { self = [super initWithFrame:frame]; if(!self) return nil; [self becomeFirstResponder]; return self; } 

或者,在UIViewController的viewDidLoad

  // ... [self.view becomeFirstResponder]; // ... 

有很多方法可以做到这一点。 ;)

请参阅我提出的用于响应脚踏板上的箭头键的解决scheme:

我怎样才能响应外部键盘的箭头键?

在IOS 7中很容易。 在以前的版本 – 不是官方。 可以从App Store中删除。

 -(NSArray * ) keyCommands { if ([[[UIDevice currentDevice] systemVersion] intValue] <7) return nil; UIKeyCommand *upArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputUpArrow modifierFlags: 0 action: @selector(upArrow:)]; UIKeyCommand *downArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputDownArrow modifierFlags: 0 action: @selector(downArrow:)]; UIKeyCommand *leftArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputLeftArrow modifierFlags: 0 action: @selector(leftArrow:)]; UIKeyCommand *rightArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputRightArrow modifierFlags: 0 action: @selector(rightArrow:)]; UIKeyCommand *escapeCom = [UIKeyCommand keyCommandWithInput:UIKeyInputEscape modifierFlags:0 action:@selector(escapeChar:)]; return [[NSArray alloc] initWithObjects: upArrow, downArrow, leftArrow, rightArrow, escapeCom, nil]; } 

它对我有用,希望对你有用。 增加版本检查,以避免在非iOS7设备中使用。