如何检测iOS默认键盘types何时从文本切换到数字
当键盘types从诸如数字键盘之类的改变为默认时,有很多关于通知用户的post 。 这个问题是关于什么时候用户实际上点击默认键盘上的[123]
或[ABC]
button..基本上我想知道这个屏幕
改变到这个屏幕
试试这个:
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { NSLog(@"::::::: this is text field type %d", searchBar.keyboardType);
自然总是给我回0
这是默认的键types..因为它假设两者是相同的键盘types。
我认为这是不可能的检测键盘types的开关。 也许你可以解释你的问题,或者你想达到什么目的,所以我们可以find你的问题的另一个解决方法。
问候
为文本对象configuration键盘直接通过应用程序的文本对象configuration键盘的属性。 UITextField和UITextView类都符合UITextInputTraits协议,该协议定义了用于configuration键盘的属性。 以编程方式或在Interface Builder检查器窗口中设置这些属性会导致系统显示指定types的键盘。
@property(nonatomic) UIKeyboardType keyboardType
没有API检测键盘改变:UITextField类的参考
keyboardType的定义是UITextInputTraits协议的一部分。 设置键盘types,例如ASCII,基本上是显示键盘自己的字母部分的标准键盘。 如果将keyboardType设置为UIKeyboardTypeNumbersAndPunctuation,则您将得到与ASCII相同的键盘,并希望键盘首先显示为键盘的数字部分。
总之,ASCII和数字和标点键盘是两个不同的方式显示的三屏键盘。
您可以在textDidChange中检测对键盘types的更改。 如果是这样,用户可以select键盘button,你可以检查UITextField的keyboardType属性:
键盘types:UIKeyboardTypeNumberPad或UIKeyboardTypeDefault
所以,你可以保存当前types,检测键盘变化,并比较新的键盘types与第一个。
今天我遇到了同样的问题,有些惊讶的是,没有办法检测到任何通知或委托方法的变化,因为我认为这是一个相当普遍的需求。 我正在构build一个多字段文本框input捕获一个PIN码。 在input数值时,我会自动前进到下一个/前一个字段,并且不希望每次切换字段时键盘都会切换回默认值。 我想出了这个解决scheme(注意:这并没有完全解决它,因为它需要用户input一些东西,但解决了这个针脚类似的需求)。
我有一个名为MyPinView的自定义视图,这个视图有var
var keyBoardType = UIKeyboardType.alphabet
和一个UITextFields
数组
var pinFields = [UITextField]()
这是如此。
对于一个简化的版本,我不会详细shouldChangeCharactersInRange
处理边缘情况需要shouldChangeCharactersInRange
来执行的细节,并坚持我的事件处理程序实现。
基本上,你需要看看input的是什么文本,并决定什么键盘显示时,推进领域(我只支持数字和字母切换与abc / 123button,所以我会忽略表情符号和其他types)。
// MARK: UITextField Event func textFieldDidChange(textField: UITextField) { // If the user typed one character, move to the next cell. if (textField.text?.count == 1) { let index = pinFields.index(of: textField) textField.resignFirstResponder() if (pinFields.count > index! + 1) { let pinField = pinFields[index! + 1] self.updateKeyboardTypeForString(input: textField.text) pinField.keyboardType = self.keyBoardType pinField.becomeFirstResponder() } } // If they deleted the character move to previous cell else if (textField.text?.count == 0) { let index = pinFields.index(of: textField) if (index! - 1 >= 0) { let pinField = pinFields[index! - 1] self.updateKeyboardTypeForString(input: pinField.text) pinField.keyboardType = self.keyBoardType pinField.becomeFirstResponder() } } } // MARK: - Keyboard Type Helper func updateKeyboardTypeForString(input:String?) { let letters = NSCharacterSet.letters let digits = NSCharacterSet.decimalDigits let pinText = input == nil ? "" : input for uniScalar in pinText!.unicodeScalars { if letters.contains(uniScalar) { self.keyBoardType = UIKeyboardType.alphabet } else if digits.contains(uniScalar) { self.keyBoardType = UIKeyboardType.numbersAndPunctuation } } }
这使您可以跟踪键盘上最后的位置。 显然,如果你的文本字段允许多个字符,你只需要抓取最后一个字符types并将其传递给updateKeyboardTypeForString
。 在这种情况下不会有帮助的主要情况是在用户切换键盘的input字段之间保留键盘状态,但不键入任何内容。 总的来说,这有助于这种types的场景更加有用。
希望这有助于,快乐的编程。