内容简介:http://stackoverflow.com/questions/13205160/how-do-i-retrieve-keystrokes-from-a-custom-keyboard-on-an-ios-app
主题专注于自定义键盘的视觉元素,但我正在努力了解如何从这个键盘中检索击键.
Apple提供了inputView机制,可以轻松地将自定义键盘与UITextField或UITextView相关联,但它们不提供将生成的击键发送回相关对象的功能.基于这些对象的典型委托,我们期望三个函数:一个正常字符,一个用于退格,一个用于输入.然而,没有人似乎明确界定这些功能或如何使用它们.
如何为我的iOS应用程序建立自定义键盘并从中检索击键?
格雷格的方法应该是有效的,但我有一种方法,不需要关于文本字段或文本视图的键盘.实际上,您可以创建键盘的单个实例并将其分配到多个文本字段和/或文本视图.键盘处理知道哪一个是第一个响应者.
这是我的做法我不会显示用于创建键盘布局的任何代码.这很简单.此代码显示所有管道.
编辑:这已经更新,以正确处理UITextFieldDelegate textField:shouldChangeCharactersInRange:replacementString:和UITextViewDelegate textView:shouldChangeTextInRange:replacementText :.
头文件:
@interface SomeKeyboard : UIView <UIInputViewAudioFeedback> @end
执行文件:
@implmentation SomeKeyboard { id<UITextInput> _input; BOOL _tfShouldChange; BOOL _tvShouldChange; } - (id)init { self = [super init]; if (self) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkInput:) name:UITextFieldTextDidBeginEditingNotification object:nil]; } return self; } // This is used to obtain the current text field/view that is now the first responder - (void)checkInput:(NSNotification *)notification { UITextField *field = notification.object; if (field.inputView && self == field.inputView) { _input = field; _tvShouldChange = NO; _tfShouldChange = NO; if ([_input isKindOfClass:[UITextField class]]) { id<UITextFieldDelegate> del = [(UITextField *)_input delegate]; if ([del respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) { _tfShouldChange = YES; } } else if ([_input isKindOfClass:[UITextView class]]) { id<UITextViewDelegate> del = [(UITextView *)_input delegate]; if ([del respondsToSelector:@selector(textView:shouldChangeTextInRange:replacementText:)]) { _tvShouldChange = YES; } } } } // Call this for each button press - (void)click { [[UIDevice currentDevice] playInputClick]; } // Call this when a button on the keyboard is tapped (other than return or backspace) - (void)keyTapped:(UIButton *)button { NSString *text = ???; // determine text for the button that was tapped if ([_input respondsToSelector:@selector(shouldChangeTextInRange:replacementText:)]) { if ([_input shouldChangeTextInRange:[_input selectedTextRange] replacementText:text]) { [_input insertText:text]; } } else if (_tfShouldChange) { NSRange range = [(UITextField *)_input selectedRange]; if ([[(UITextField *)_input delegate] textField:(UITextField *)_input shouldChangeCharactersInRange:range replacementString:text]) { [_input insertText:text]; } } else if (_tvShouldChange) { NSRange range = [(UITextView *)_input selectedRange]; if ([[(UITextView *)_input delegate] textView:(UITextView *)_input shouldChangeTextInRange:range replacementText:text]) { [_input insertText:text]; } } else { [_input insertText:text]; } } // Used for a UITextField to handle the return key button - (void)returnTapped:(UIButton *)button { if ([_input isKindOfClass:[UITextField class]]) { id<UITextFieldDelegate> del = [(UITextField *)_input delegate]; if ([del respondsToSelector:@selector(textFieldShouldReturn:)]) { [del textFieldShouldReturn:(UITextField *)_input]; } } else if ([_input isKindOfClass:[UITextView class]]) { [_input insertText:@"\n"]; } } // Call this to dismiss the keyboard - (void)dismissTapped:(UIButton *)button { [(UIResponder *)_input resignFirstResponder]; } // Call this for a delete/backspace key - (void)backspaceTapped:(UIButton *)button { if ([_input respondsToSelector:@selector(shouldChangeTextInRange:replacementText:)]) { UITextRange *range = [_input selectedTextRange]; if ([range.start isEqual:range.end]) { UITextPosition *newStart = [_input positionFromPosition:range.start inDirection:UITextLayoutDirectionLeft offset:1]; range = [_input textRangeFromPosition:newStart toPosition:range.end]; } if ([_input shouldChangeTextInRange:range replacementText:@""]) { [_input deleteBackward]; } } else if (_tfShouldChange) { NSRange range = [(UITextField *)_input selectedRange]; if (range.length == 0) { if (range.location > 0) { range.location--; range.length = 1; } } if ([[(UITextField *)_input delegate] textField:(UITextField *)_input shouldChangeCharactersInRange:range replacementString:@""]) { [_input deleteBackward]; } } else if (_tvShouldChange) { NSRange range = [(UITextView *)_input selectedRange]; if (range.length == 0) { if (range.location > 0) { range.location--; range.length = 1; } } if ([[(UITextView *)_input delegate] textView:(UITextView *)_input shouldChangeTextInRange:range replacementText:@""]) { [_input deleteBackward]; } } else { [_input deleteBackward]; } [self updateShift]; } @end
此类需要UITextField的类别方法:
@interface UITextField (CustomKeyboard) - (NSRange)selectedRange; @end @implementation UITextField (CustomKeyboard) - (NSRange)selectedRange { UITextRange *tr = [self selectedTextRange]; NSInteger spos = [self offsetFromPosition:self.beginningOfDocument toPosition:tr.start]; NSInteger epos = [self offsetFromPosition:self.beginningOfDocument toPosition:tr.end]; return NSMakeRange(spos, epos - spos); } @end
http://stackoverflow.com/questions/13205160/how-do-i-retrieve-keystrokes-from-a-custom-keyboard-on-an-ios-app
以上所述就是小编给大家介绍的《如何从iOS应用程序的自定义键盘检索击键?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Android获取软键盘的高度、键盘的打开与关闭、监听键盘处于打开还是关闭状态
- ios 最新系统bug与解决——微信公众号中弹出键盘再收起时,原虚拟键盘位点击
- iOS键盘动画细节
- Swift关闭UITextView键盘
- ios 最新系统bug与解决——微信公众号中弹出键盘再收起时,原虚拟键盘位点击事件无效
- Swift自定义表情键盘+录音
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。