如何检测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的场景更加有用。

希望这有助于,快乐的编程。