Как создать обертку для PKPaymentButton

Я пытаюсь реализовать PKPaymentButton в SwiftUI, но не могу понять, как создать оболочку для PKPaymentButton. Мой код ниже:

struct ApplePayButton: UIViewRepresentable {

    func makeUIViewController(context: Context) -> PKPaymentButton {
        return PKPaymentButton.init()
    }

    func updateUIView(_ uiView: ApplePayButton.UIViewType, context: UIViewRepresentableContext<ApplePayButton>) {
        //
    }
}

Я получаю следующие ошибки:

  • Ссылка на недопустимый связанный тип 'UIViewType' типа 'ApplePayButton'
  • Тип ApplePayButton не соответствует протоколу UIViewRepresentable.

Кто-нибудь смог это сделать, или у кого-нибудь есть лучший способ реализовать Apple Pay в SwiftUI?

1 ответ

Решение

Объявление должно быть таким:

import SwiftUI
import UIKit
import PassKit

struct ApplePayButton: UIViewRepresentable {


    func makeUIView(context: Context) -> PKPaymentButton {
        return PKPaymentButton()
    }

    func updateUIView(_ uiView: PKPaymentButton, 
                 context: UIViewRepresentableContext<ApplePayButton>) {
        //
    }
}

Это заняло у меня НАВСЕГДА, чтобы понять, так что, возможно, кому-то это пригодится:

По сути, недостаточно просто обернуть кнопку в UIViewRepresentable. Вы должны поместить это в ButtonStyle, а затем стилизовать с ним кнопку SwiftUI. Если вы этого не сделаете, похоже, что ваш платежный лист сломается! Я не уверен, почему это правда, но вот код, как он должен работать:

import SwiftUI
import UIKit
import PassKit

struct PaymentButton: View {
    var body: some View {
        Button(action: { /* Custom payment code here */ }, label: { EmptyView() } )
            .buttonStyle(PaymentButtonStyle())
    }
}

struct PaymentButtonStyle: ButtonStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        return PaymentButtonHelper()
    }
}  
    
struct PaymentButtonHelper: View {
    var body: some View {
        PaymentButtonRepresentable()
            .frame(minWidth: 100, maxWidth: 400)
            .frame(height: 60)
            .frame(maxWidth: .infinity)
    }
}

extension PaymentButtonHelper {
    struct PaymentButtonRepresentable: UIViewRepresentable {
    
    var button: PKPaymentButton {
        let button = PKPaymentButton(paymentButtonType: .buy, paymentButtonStyle: .black) /*customize here*/
        button.cornerRadius = 4.0 /* also customize here */
        return button
    }
     
    func makeUIView(context: Context) -> PKPaymentButton {
        return button
    }
    func updateUIView(_ uiView: PKPaymentButton, context: Context) { }
}

Тогда использование будет:

struct ContentView: View {
    var body: some View {
        PaymentButton()
    }
}
Другие вопросы по тегам