尝试 segue 或实例化到 vc 时出现初始化错误

getting initialization error when trying to segue or instantiate to vc

所以我的目标是将数据传输到 Stripe 为其 API 提供的 CheckoutViewController()。所以像往常一样,我去了故事板并将一个新的 vc 与 CheckoutViewController() class 连接起来,这样我就可以从我的另一个 vc 转到它并进行数据传输。

在此之前,我只是在推动 vc,它工作正常并且知道我可以实例化它并进行数据传输,但即使我尝试这样做,我也得到了致命错误说:

Fatal error: init(coder:) has not been implemented

这是我在 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)
}

我更改了 required init 因为我读了 但现在它甚至在 运行 之前就给出了一个错误说:

Property 'self.paymentContext' not initialized at super.init call

在我将 class 连接到情节提要中的 vc 之前,一切正常,但我别无选择,我需要为用户进行数据传输以支付正确的金额.我不明白 self.paymentContext 是怎么没有初始化的,我以前用这个很好。有人知道我该如何解决或解决这个问题吗?

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)
}

像这样?

当出现故事板时,调用的是 initWithCoder:,而不是您的 init() 函数,并且您的 initWithCoder 实现在初始化所有属性之前调用 super

创建一个名为 commonInit 的函数并让所有不同的 initWith..s 调用 commonInit 可能会有所帮助,因此您的视图控制器可以通过编程方式或从 nibs 等实例化

哥们上面解释的方式真的把我吓了一跳,但后来我意识到他基本上是对的,我需要做的就是:

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
}

现在效果很好。