尝试 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
}
现在效果很好。
所以我的目标是将数据传输到 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
}
现在效果很好。