如何检测iOS默认键盘类型何时从文本切换到数字

时间:2014-01-21 10:22:19

标签: ios iphone objective-c cocoa-touch uikeyboard

当键盘类型从数字键盘变为默认值时,有many posts通知用户。这个问题是关于了解用户何时实际点击默认键盘上的[123][ABC]按钮...基本上我想知道何时此屏幕

enter image description here

更改此屏幕

enter image description here

尝试这个:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    NSLog(@"::::::: this is text field type %d", searchBar.keyboardType);

自然总是给我回0这是默认的键类型..因为它假设两者都是相同的键盘类型。

5 个答案:

答案 0 :(得分:2)

我今天遇到了同样的问题,并且有点惊讶于没有办法从任何通知或委托方法中检测到这种变化,因为我认为这是一个相当普遍的需求。我正在构建一个用于捕获PIN码的多字段文本框输入。我在输入值时自动前进到下一个/上一个字段,并且每次切换字段时都不希望键盘切换回默认值。我提出了这个解决方案(请注意:这并不能完美地解决它,因为它需要用户输入内容,但需要解决它以满足此引脚视图的类似需求)。

我有一个名为MyPinView的自定义视图,此视图具有var

var keyBoardType = UIKeyboardType.alphabet

以及UITextFields

的数组

var pinFields = [UITextField]()

就是这样布局的。 enter image description here

对于简化版本,我不会详细介绍处理需要shouldChangeCharactersInRange实现的边缘情况的所有细节,并且会坚持使用我的事件处理程序实现。

基本上,您需要查看键入的文本,并确定在前进字段时要显示的键盘(我只支持使用abc / 123按钮切换的数字和字母,因此我将忽略表情符号和其他类型)。

// 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
        }
    }
}

这使您可以跟踪键盘最后离开的位置。显然,如果您的文本字段允许多个字符,则只需抓取最后一个类型字符并将其传递给updateKeyboardTypeForString。这种情况无济于事的主要情况是在用户切换键盘但未键入任何内容的输入字段之间保留键盘状态。总的来说,这有助于这种情况更有用。

希望这有帮助,快乐编程。

答案 1 :(得分:0)

配置文本对象的键盘 您可以通过应用程序的文本对象直接配置键盘的属性。 UITextField和UITextView类都符合UITextInputTraits协议,该协议定义了配置键盘的属性。以编程方式或在Interface Builder检查器窗口中设置这些属性会导致系统显示指定类型的键盘。

@property(nonatomic) UIKeyboardType keyboardType

答案 2 :(得分:0)

我认为无法检测键盘类型开关。也许您可以解释您的问题或您想要实现的目标,以便我们找到您问题的另一种解决方法。

此致

答案 3 :(得分:0)

没有用于检测键盘的API已更改:UITextField类引用

keyboardType的定义是UITextInputTraits协议的一部分。设置keyboardType,例如ASCII,基本上是标准键盘,显示键盘自身的字母部分。如果将keyboardType设置为UIKeyboardTypeNumbersAndPunctuation,则会获得与ASCII相同的键盘,键盘首先显示键盘的数字部分。

在摘要中,ASCII和数字和标点键盘是相同的,三屏键盘,以两种不同的方式呈现。

答案 4 :(得分:0)

您可以在textDidChange中检测键盘类型的更改。 如果是这样,用户可以选择键盘按钮,您可以检查UITextField的keyboardType属性:

KeyboardType:UIKeyboardTypeNumberPad或UIKeyboardTypeDefault

因此,哟可以保存当前类型,检测键盘更改,并将新键盘类型与第一个类型进行比较。