Как создать обертку для 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()
}
}