Stripe - STPPaymentCardTextField - 如何删除或隐藏 CVC 代码字段?
Stripe - STPPaymentCardTextField - How to remove or hide CVC code field?
Stripe 的 iOS SDK "STPPaymentCardTextField" 有 4 个字段用于为卡生成令牌:1. 信用卡号 2. 到期月份 3. 到期年份 4. CVC 字段
我们只保存信用卡号和有效期 month/year。我们不需要从用户那里获取 CVC 号码。那么如何从 STPPaymentCardTextField 中隐藏或删除 CVC 字段。
请给我一些处理这个过程的想法。
是可以的但是我们需要小心操作,ok打开STPPaymentCardTextField.m
文件你会得到CVC字段名属性为STPFormTextField
@property(nonatomic, readwrite, weak)STPFormTextField *cvcField;
最终隐藏与 cvcField
相关的内容,它出现在该页面上它周围的位置占据该页面中的 21 个位置,例如
STPFormTextField *cvcField = [self buildTextField];
cvcField.tag = STPCardFieldTypeCVC;
cvcField.alpha = 0;
self.cvcField = cvcField;
self.cvcPlaceholder = @"CVC";
[self.fieldsView addSubview:cvcField];
- (void)setCvcPlaceholder:(NSString * __nullable)cvcPlaceholder {
_cvcPlaceholder = [cvcPlaceholder copy];
self.cvcField.placeholder = _cvcPlaceholder;
}
否则做个把戏隐藏
[self.fieldsView addSubview:cvcField];
方式一:修改框架源码
如果您不介意修改框架源代码,您实际上可以更轻松地完成此操作:
在STPPaymentCardTextField.m
变化
self.allFields = @[numberField,
expirationField,
cvcField,
postalCodeField];
进入
self.allFields = @[numberField,
expirationField,
postalCodeField];
并在 STPPaymentCardTextFieldViewModel.m
中更改
- (BOOL)isValid {
return ([self validationStateForField:STPCardFieldTypeNumber] == STPCardValidationStateValid
&& [self validationStateForField:STPCardFieldTypeExpiration] == STPCardValidationStateValid
&& [self validationStateForField:STPCardFieldTypeCVC] == STPCardValidationStateValid
&& (!self.postalCodeRequired
|| [self validationStateForField:STPCardFieldTypePostalCode] == STPCardValidationStateValid));
}
进入
- (BOOL)isValid {
return ([self validationStateForField:STPCardFieldTypeNumber] == STPCardValidationStateValid
&& [self validationStateForField:STPCardFieldTypeExpiration] == STPCardValidationStateValid
&& (!self.postalCodeRequired
|| [self validationStateForField:STPCardFieldTypePostalCode] == STPCardValidationStateValid));
}
第二种方式:继承STPPaymentCardTextField
我不喜欢编辑框架,因为我喜欢更新,所以我通过继承 STPPaymentCardTextField
(Swift 中的示例)来做到这一点:
class STPPaymentCardTextFieldNoCVC: STPPaymentCardTextField {
func removeCVC() {
if let fieldsView = subviews.first {
for view in fieldsView.subviews where view.tag == 2 {
// set a default cvc for the validator and remove the field
(view as? UITextField)?.text = "123"
view.removeFromSuperview()
}
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
removeCVC()
}
override init(frame: CGRect) {
super.init(frame: frame)
removeCVC()
}
}
Stripe 的 iOS SDK "STPPaymentCardTextField" 有 4 个字段用于为卡生成令牌:1. 信用卡号 2. 到期月份 3. 到期年份 4. CVC 字段
我们只保存信用卡号和有效期 month/year。我们不需要从用户那里获取 CVC 号码。那么如何从 STPPaymentCardTextField 中隐藏或删除 CVC 字段。
请给我一些处理这个过程的想法。
是可以的但是我们需要小心操作,ok打开STPPaymentCardTextField.m
文件你会得到CVC字段名属性为STPFormTextField
@property(nonatomic, readwrite, weak)STPFormTextField *cvcField;
最终隐藏与 cvcField
相关的内容,它出现在该页面上它周围的位置占据该页面中的 21 个位置,例如
STPFormTextField *cvcField = [self buildTextField];
cvcField.tag = STPCardFieldTypeCVC;
cvcField.alpha = 0;
self.cvcField = cvcField;
self.cvcPlaceholder = @"CVC";
[self.fieldsView addSubview:cvcField];
- (void)setCvcPlaceholder:(NSString * __nullable)cvcPlaceholder {
_cvcPlaceholder = [cvcPlaceholder copy];
self.cvcField.placeholder = _cvcPlaceholder;
}
否则做个把戏隐藏
[self.fieldsView addSubview:cvcField];
方式一:修改框架源码
如果您不介意修改框架源代码,您实际上可以更轻松地完成此操作:
在STPPaymentCardTextField.m
变化
self.allFields = @[numberField,
expirationField,
cvcField,
postalCodeField];
进入
self.allFields = @[numberField,
expirationField,
postalCodeField];
并在 STPPaymentCardTextFieldViewModel.m
中更改
- (BOOL)isValid {
return ([self validationStateForField:STPCardFieldTypeNumber] == STPCardValidationStateValid
&& [self validationStateForField:STPCardFieldTypeExpiration] == STPCardValidationStateValid
&& [self validationStateForField:STPCardFieldTypeCVC] == STPCardValidationStateValid
&& (!self.postalCodeRequired
|| [self validationStateForField:STPCardFieldTypePostalCode] == STPCardValidationStateValid));
}
进入
- (BOOL)isValid {
return ([self validationStateForField:STPCardFieldTypeNumber] == STPCardValidationStateValid
&& [self validationStateForField:STPCardFieldTypeExpiration] == STPCardValidationStateValid
&& (!self.postalCodeRequired
|| [self validationStateForField:STPCardFieldTypePostalCode] == STPCardValidationStateValid));
}
第二种方式:继承STPPaymentCardTextField
我不喜欢编辑框架,因为我喜欢更新,所以我通过继承 STPPaymentCardTextField
(Swift 中的示例)来做到这一点:
class STPPaymentCardTextFieldNoCVC: STPPaymentCardTextField {
func removeCVC() {
if let fieldsView = subviews.first {
for view in fieldsView.subviews where view.tag == 2 {
// set a default cvc for the validator and remove the field
(view as? UITextField)?.text = "123"
view.removeFromSuperview()
}
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
removeCVC()
}
override init(frame: CGRect) {
super.init(frame: frame)
removeCVC()
}
}