So my goal is to do a data transfer to the CheckoutViewController()
that Stripe provides for their API. So as normal, I went to storyboards and connected a new vc with the CheckoutViewController()
class so I can segue to it from my other vc and do a data transfer.
Before this, I was just pushing the vc, and it was working normally and knew I could instantiate it and do a data transfer as well, but even when I try to do it, I get a fatal error saying :
Fatal error: init(coder:) has not been implemented
This is the code I have in the CheckoutVC
:
let paymentContext: STPPaymentContext?
let config: STPPaymentConfiguration
let customerContext = STPCustomerContext(keyProvider: MyAPIClient())
init() {
let config = STPPaymentConfiguration()
let paymentContext = STPPaymentContext(customerContext: customerContext, configuration: config, theme: .defaultTheme)
config.requiredBillingAddressFields = .name
self.paymentContext = paymentContext
self.config = config
super.init(nibName: nil, bundle: nil)
self.paymentContext?.delegate = self
self.paymentContext?.hostViewController = self
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
I changed the required init
because I read this post on init errors but now it gives an error before even running saying:
Property 'self.paymentContext' not initialized at super.init call
This was all working before I connected the class to a vc in the storyboard, but I literally have no choice, I need to do a data transfer for users to pay the right amount. I don't get how the self.paymentContext
wasn't initialized, I was using this just fine before. Does anybody know how I can solve this or work around it?
init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
let config = STPPaymentConfiguration()
let paymentContext = STPPaymentContext(customerContext: customerContext, configuration: config, theme: .defaultTheme)
config.requiredBillingAddressFields = .name
self.paymentContext = paymentContext
self.config = config
self.paymentContext?.delegate = self
self.paymentContext?.hostViewController = self
super.init(coder: aDecoder)
}
Like this?
The way buddy explained it above really just tripped me out, but eventually I realized he was basically right, all I needed to do was this:
let paymentContext: STPPaymentContext
let config: STPPaymentConfiguration
let customerContext = STPCustomerContext(keyProvider: MyAPIClient())
required init?(coder aDecoder: NSCoder) {
let config = STPPaymentConfiguration()
let paymentContext = STPPaymentContext(customerContext: customerContext, configuration: config, theme: .defaultTheme)
config.requiredBillingAddressFields = .name
self.paymentContext = paymentContext
self.config = config
super.init(coder: aDecoder )
self.paymentContext.delegate = self
self.paymentContext.hostViewController = self
}
Works good now.