PKAddPaymentPassViewController取消按钮无响应问题求助
PKAddPaymentPassViewController取消按钮无响应问题解决
当使用第三方工具生成PKAddPaymentPassViewController时,取消按钮无响应的核心原因是没有为控制器设置代理并实现对应的协议方法。PKAddPaymentPassViewController依赖PKAddPaymentPassViewControllerDelegate来处理取消、完成等用户操作回调。
解决步骤:
- 让你的
ViewController遵循PKAddPaymentPassViewControllerDelegate协议 - 在获取到控制器实例后,手动设置其
delegate属性为当前控制器 - 实现协议要求的两个代理方法,处理取消和添加完成逻辑
修改后的完整代码:
import UIKit import PassKit class ViewController: UIViewController, PKAddPaymentPassViewControllerDelegate { override func viewDidLoad() { super.viewDidLoad() setupApplePayButton() } private func setupApplePayButton() { let passKitButton = PKAddPassButton(addPassButtonStyle: .blackOutline) passKitButton.addTarget(self, action: #selector(onEnroll), for: .touchUpInside) view.addSubview(passKitButton) passKitButton.translatesAutoresizingMaskIntoConstraints = false passKitButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 32).isActive = true passKitButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 32).isActive = true passKitButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32).isActive = true } @objc private func onEnroll(button: UIButton) { print("User wants to enroll") let checkDevice = PassKitCardDetector.checkSupportApplePay(cardSuffix: "9000") print(checkDevice) let requestGenerator = PassKitRequestGenerator( primaryAccountIdentifier: nil, primaryAccountSuffix: "9000", localizedDescription: "AAA", paymentNetwork: .visa, encryptionScheme: .ECC_V2 ) { [weak self] passData, _ in // 处理卡片数据回调逻辑 } completion: { _ in // 处理请求完成逻辑 } guard let addPassVC = requestGenerator.inAppViewController() else { print("Failed to create PKAddPaymentPassViewController") return } // 设置代理,这是取消按钮能响应的关键 addPassVC.delegate = self present(addPassVC, animated: true) } // MARK: - PKAddPaymentPassViewControllerDelegate // 用户点击取消或添加完成后触发,负责关闭控制器 func addPaymentPassViewControllerDidFinish(_ controller: PKAddPaymentPassViewController) { controller.dismiss(animated: true) print("用户取消或完成卡片添加,控制器已关闭") } // 卡片添加完成后的结果回调(成功/失败) func addPaymentPassViewController(_ controller: PKAddPaymentPassViewController, didFinishAddingPass pass: PKPaymentPass?, error: Error?) { if let error = error { print("卡片添加失败:\(error.localizedDescription)") } else if let pass = pass { print("卡片添加成功:\(pass.primaryAccountSuffix ?? "")") } } }
关键说明:
addPaymentPassViewControllerDidFinish(_:)是必须实现的方法,无论用户点击取消还是完成添加,系统都会调用这个方法,你需要在这里手动关闭控制器。addPaymentPassViewController(_:didFinishAddingPass:error:)用于获取添加操作的具体结果(成功或失败),可以在这里做对应的业务逻辑处理。- 必须确保为
PKAddPaymentPassViewController设置delegate,否则取消按钮的点击事件不会被捕获,也就无法触发任何回调。
内容的提问来源于stack exchange,提问作者Minh Tâm Nguyễn
相关产品推荐
相关产品推荐

