我有一个使用数字键盘的名为“安全代码”的文本字段。但是当我输入时,什么也没有显示。 (其他文本字段都工作正常)
错误消息:
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的建议,添加:在
的第一行中返回truefunc textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
,现在可以在文本字段中键入。因此,问题在于此功能不正确。
答案 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”