安装StripeCardScan后,STPPaymentCardTextField无法接收程序化卡号输入
问题根源与解决方案
核心问题
你直接修改STPPaymentCardTextField的paymentMethodParams.card是无效的——因为paymentMethodParams是只读属性,它是根据输入框当前的UI内容动态生成的,手动修改这个对象不会同步到输入框的显示上。
正确的赋值方式
要给STPPaymentCardTextField程序化设置卡号,得用它提供的专门方法:setCardNumber(_:),如果扫描结果包含有效期、CVC信息,也可以用对应方法设置:
修改你的代码如下:
cardScanSheet.present(from: self) { [weak self] result in var title = "" var message = "" switch result { case .completed(let card): title = "Scan Completed" message = card.pan // 直接调用输入框的卡号设置方法 self?.addCardView.cardField.setCardNumber(card.pan) // 若扫描到有效期,同步设置 if let expMonth = card.expMonth, let expYear = card.expYear { self?.addCardView.cardField.setExpirationMonth(expMonth) self?.addCardView.cardField.setExpirationYear(expYear) } print("card pan: \(card.pan)") case .canceled: title = "Scan Canceled" message = "Canceled the scan" case .failed(let error): title = "Scan Failed" message = "Failed with error: \(error.localizedDescription)" } }
关于代理的疑问
代理(STPPaymentCardTextFieldDelegate)不是导致赋值失败的原因,它的作用是监听输入框的内容变化、验证状态、编辑事件等。如果你的业务需要这些回调(比如输入完成后自动提交),再设置代理即可,不需要为了赋值专门配置。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

