【问题标题】:Stripe - STPPaymentCardTextField - How to remove or hide CVC code field?Stripe - STPPaymentCardTextField - 如何删除或隐藏 CVC 代码字段?
【发布时间】:2016-08-23 09:59:53
【问题描述】:

Stripe 的 iOS SDK 的“STPPaymentCardTextField”有 4 个字段用于生成卡的令牌:1. 信用卡号 2. 到期月份 3. 到期年份 4. CVC 字段

我们只保存信用卡号和到期月/年。我们不需要从用户那里获取 CVC 号码。那么如何在 STPPaymentCardTextField 中隐藏或删除 CVC 字段。

请给我一些想法来处理这个过程。

【问题讨论】:

    标签: ios swift stripe-payments


    【解决方案1】:

    这是可能的,但我们需要小心,打开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];
    

    【讨论】:

    • @EricAya - 目标 C 中可用的条带 SDK - 在这里我回答覆盖条带 SDK 上的代码
    • @EricAya - 看到这个github.com/stripe/stripe-ios/tree/master/Stripe,我的回答是我们需要覆盖这个,而不是在我们的班级,这是我在这里添加兄弟的原因
    • @EricAya - 没关系的兄弟
    • @Anbu.Karthik - 感谢您的快速回复。躲到哪里。但由于插入 nil 对象而崩溃。 "*** 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'*** -[__NSPlaceholderArray initWithObjects:count:]: 尝试从对象 [1] 中插入 nil 对象' ***"
    • @Sabs :我已经提到我们需要一步一步地进行之后才能获得 OP,简单的__NSPlaceholderArray initWithObjects:count:]:- 这是错误的意思 - 尝试设置 CVC 字段占位符文本,所以一步一步检查你会得到答案
    【解决方案2】:

    第一种方式:修改框架源码

    如果您可以修改框架源代码,您实际上可以更轻松地做到这一点:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      相关资源
      最近更新 更多