У меня есть текстовое поле с именем «Код безопасности», которое использует цифровую клавиатуру. Но когда я печатаю, ничего не отображается. (Все остальные текстовые поля работают хорошо)
Сообщение об ошибке:
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 {
и теперь можете печатать внутри текстового поля. Таким образом, проблема в том, что эта функция не является правильной.