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()
  }
}