Как представить STPPaymentOptionsViewController в быстром пользовательском интерфейсе - PullRequest
2 голосов
/ 25 февраля 2020
.sheet(isPresented: $showSheet) {
    STPPaymentOptionsViewController()
} 

Я запускаю этот код, надеясь представить контроллер представления вариантов оплаты Stripe в моем представлении содержимого, и я получаю эту ошибку:

Метод экземпляра sheet(isPresented:onDismiss:content:) требует, чтобы STPAddCardViewController соответствовало View

Я также пытался обернуть представление в UIViewRepresentable примерно так:

struct PaymentOptionsView: UIViewRepresentable {
    func makeUIView(context: Context) -> STPPaymentOptionsViewController {
        let config = STPPaymentConfiguration()
        config.additionalPaymentOptions = .default
        config.requiredBillingAddressFields = .none
        config.appleMerchantIdentifier = "dummy-merchant-id"
        return STPPaymentOptionsViewController(configuration: config, e: STPTheme(), customerContext: STPCustomerContext(), delegate: self as! STPPaymentOptionsViewControllerDelegate)   
    }
}

Тогда я получаю ошибку:

Тип CheckOut.PaymentOptionsView не соответствует протокол UIViewRepresentable.

1 Ответ

1 голос
/ 25 февраля 2020

Учитывая, что STPPaymentOptionsViewController наследуется от ViewController, вам нужно вместо этого использовать UIViewControllerRepresentable.

Вам также необходимо реализовать необходимые методы делегата для STPPaymentOptionsViewControllerDelegate.

struct PaymentOptionsView: UIViewControllerRepresentable {
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, STPPaymentOptionsViewControllerDelegate {
        var control: PaymentOptionsView

        init(_ control: PaymentOptionsView) {
            self.control = control
        }

        // Implement required delegate methods here:
        func paymentOptionsViewControllerDidCancel(_ paymentOptionsViewController: STPPaymentOptionsViewController) {

        }

        func paymentOptionsViewControllerDidFinish(_ paymentOptionsViewController: STPPaymentOptionsViewController) {

        }

        func paymentOptionsViewController(_ paymentOptionsViewController: STPPaymentOptionsViewController, didFailToLoadWithError error: Error) {

        }
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<PaymentOptionsView>) -> STPPaymentOptionsViewController {
        let config = STPPaymentConfiguration()
        config.additionalPaymentOptions = .default
        config.requiredBillingAddressFields = .none
        config.appleMerchantIdentifier = "dummy-merchant-id"

        return STPPaymentOptionsViewController(configuration: config, theme: STPTheme(), apiAdapter: STPCustomerContext(), delegate: context.coordinator)
    }

    func updateUIViewController(_ uiViewController: STPPaymentOptionsViewController, context: UIViewControllerRepresentableContext<PaymentOptionsView>) { }
}

Имейте в виду, что вы также неправильно указали делегата в STPPaymentOptionsViewController. Вам нужно использовать context.coordinator вместо self as! STPPaymentOptionsViewControllerDelegate.

...