Текстовое поле не может вводить или не показывает номер ключа - PullRequest
0 голосов
/ 11 июня 2019

У меня есть текстовое поле с именем «Код безопасности», которое использует цифровую клавиатуру. Но когда я печатаю, ничего не отображается. (Все остальные текстовые поля работают хорошо)

Cannot Type in

Сообщение об ошибке:

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 голосов
/ 11 июня 2019

Решение: Модифицированный код:

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» будет возвращать значение в соответствии с типом карты, и вся функция будет возвращать «true», когда длина введенного числа меньше или равна «cvcCount»

...