0

我正在实现一个带有 ViewModel 的 UIViewController 作为传递给 UIViewController 的参数,但我似乎无法让委托函数工作,这样做的正确方法是什么?

CartView.swift

struct PaymentWrapper: UIViewControllerRepresentable {
    typealias UIViewControllerType = CustomUIPaymentViewController
    
    @ObservedObject var viewModel: CartViewModel
    
    var vc: CustomUIPaymentViewController?
    var foo: (String) -> Void
    public init(viewModel: CartViewModel) {
        self.viewModel = viewModel
        self.vc = CustomUIPaymentViewController.init(token: self.viewModel.mtToken)
    }

    func makeUIViewController(context: Context) -> CustomUIPaymentViewController {
        return vc!
    }

    func updateUIViewController(_ uiViewController: CustomUIPaymentViewController, context: Context) {
//        code
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(vc: vc!, foo: foo)
    }

    class Coordinator: NSObject, CustomUIPaymentViewControllerDelegate, CustomUINavigationControllerDelegate {
        var foo: (String) -> Void
        
        init(vc: CustomUIPaymentViewController, foo: @escaping (String) -> Void) {
            self.foo = foo
            super.init()
            vc.delegate = self
        }

        func paymentViewController(_ viewController: CustomUIPaymentViewController!, paymentFailed error: Error!) {
            foo("FAILED")
        }
            
        func paymentViewController(_ viewController: CustomUIPaymentViewController!, paymentPending result: TransactionResult!) {
            foo("PENDING")
        }
            
        func paymentViewController(_ viewController: CustomUIPaymentViewController!, paymentSuccess result: TransactionResult!) {
            foo("SUCCESS")
        }

        func paymentViewController_paymentCanceled(_ viewController: CustomUIPaymentViewController!) {
            foo("CANCEL")
        }

        //This delegate methods is added on ios sdk v1.16.4 to handle the new3ds flow
        func paymentViewController(_ viewController: CustomUIPaymentViewController!, paymentDeny result: TransactionResult!) {
        }
    }
}


struct CartView: View {
    @ObservedObject var viewModel = CartViewModel()
    
    var body: some View {
VStack {
            Header(title: "Cart", back: false)
        }
        .sheet(isPresented: $viewModel.showPayment) {
            PaymentWrapper(viewModel: self.viewModel) { data in
                print(data)
                // This returns error "Extra trailing closure passed in call"
            }
        }
    }
}

如何让代表工作?我究竟做错了什么?先感谢您。

4

0 回答 0