文本字段无法键入或不显示键入数字

时间:2019-06-11 04:14:18

标签: ios swift textfield

我有一个使用数字键盘的名为“安全代码”的文本字段。但是当我输入时,什么也没有显示。 (其他文本字段都工作正常)

Cannot Type in "Security Code" Textfield

错误消息:

Can't find keyplane that supports type 4 for keyboard iPhone-PortraitTruffle-NumberPad; using 20615_PortraitTruffle_iPhone-Simple-Pad_Default

我搜索了此错误消息,并得到了使用hardware->keybard->connect hardware keyboard解决的答案。但是我认为这是另一个问题,不能解决我的问题。对于真实设备和模拟器,都存在此问题。顺便说一句,数字键盘会正常弹出,但是当我点击键盘时,文本字段中没有任何显示。

我试图将键盘类型从数字键盘更改为默认键盘或其他键盘,但是也无法正常工作。

我认为这可能是因为文本字段未正确输入我键入的内容。

这是我的一些代码:(AddCreditCardVC.swift)

    @IBOutlet weak var txtSecurityCode: SkyFloatingLabelTextField! {
        didSet{
            txtSecurityCode.isMandatory = true
        }
    }

    @objc func commonInit() {   
        txtSecurityCode.text = "abc"
        txtSecurityCode.isEnabled = false      
    }

    @objc func addCreditCard() {
        viewModel.securityCode = txtSecurityCode.text

        viewModel.addCreditCard(success: {
            // post noti
            self.postCreditCardUpdatedNoti()
            self.dismiss(animated: true)
        }) {
            self.showAlert($0)
        }
    }

    @objc func initTextFields() {
        creditCardMaskDelegate.listener = self
        txtSecurityCode.delegate = self
        setupSkyTextFields(textField: txtSecurityCode, placholder: "Security Code *", title: "SECURITY CODE *", text: "", isMandatory: true)
        [txtCreditCardNo,txtExpiryYear,txtExpiryMonth,txtSecurityCode].forEach {
            $0?.errorTextColor = .black 
        }
    }

extension AddCreditCardVC: MaskedTextFieldDelegateListener {
    func textField(_ textField: UITextField, didFillMandatoryCharacters complete: Bool, didExtractValue value: String) {
        // do nothing
    }
}

extension AddCreditCardVC: UITextFieldDelegate {


    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {


        if textField == txtCreditCardNo {
            let card = STPCardValidator.brand(forNumber: textField.text ?? "")
            imgCardType.image = CardType(rawValue: card.rawValue)?.getCardLogo()
            cvcCount = CardType(rawValue: card.rawValue)?.getCvcCount() ?? 0
        }

        print("textField-->", txtSecurityCode)

        if textField  == txtSecurityCode {
            guard let text = textField.text else { return true }
            let newLength = text.count + string.count - range.length
            return newLength <= cvcCount



        }
        return true
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {

        if textField == txtExpiryMonth {
            isExpireMonth = true
            expirePicker.isMonth = true
            expirePicker.setExpireMonth()
        }else if textField == txtExpiryYear {
            isExpireMonth = false
            expirePicker.setExpireYear()
        }
    }
}

对于print("textField-->", txtSecurityCode),当我在“安全代码”文本字段中点击键盘时,它将返回:

Optional(<SkyFloatingLabelTextField.SkyFloatingLabelTextField: 0x7fd3a4173800; baseClass = UITextField; frame = (24 3; 148 41); text = ''; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x600003bfbed0>; layer = <CALayer: 0x600003463bc0>>)

更新: 根据@matt的建议,添加:在

的第一行中返回true
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

,现在可以在文本字段中键入。因此,问题在于此功能不正确。

1 个答案:

答案 0 :(得分:0)

解决方案:修改后的代码:

if textField  == txtSecurityCode {
            guard let text = textField.text else { return true }
            let newLength = text.count + string.count - range.length

            let card = STPCardValidator.brand(forNumber: txtCreditCardNo.text ?? "")
            imgCardType.image = CardType(rawValue: card.rawValue)?.getCardLogo()
            cvcCount = CardType(rawValue: card.rawValue)?.getCvcCount() ?? 0

            return newLength <= cvcCount    
        }

此功能用于根据卡类型限制文本字段“安全代码”的长度。但是以前,代码始终将“ cvcCount”值设置为“ 0”,并且该函数将始终返回“ false”。这就是为什么它不能输入任何东西的原因。修改后,“ cvcCount”将根据卡的类型返回值,当输入的数字长度小于或等于“ cvcCount”时,整个函数将始终返回“ true”