Init (coder:) не был реализован в быстрых

У меня есть этот файл класса для принятия платежей по карте

import UIKit
class PaymentViewController: UIViewController , PTKViewDelegate {

    var card : STPCard
    var PaymentView : PTKView
    var button   = UIButton.buttonWithType(UIButtonType.System) as UIButton

    init(PaymentView : PTKView , button : UIButton, card : STPCard) {
        self.PaymentView = PaymentView
        self.button = button
        self.card = card
        super.init()
    }
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
}

Когда я его создаю, он работает нормально, но когда я его запускаю (запустил) на моем самом устройстве, я получаю

fatal error: init(coder:) has not been implemented.

Любые идеи?

Ответы

Ответ 1

Основываясь на Иерархии наследования, которую вы настроили. PaymentViewController унаследует 3 метода инициализации. UIViewController предоставляет init(nibName:bundle) в качестве назначенного инициализатора. UIViewController также соответствует NSCoding, откуда берется required init(coder:). UIViewController также наследуется от NSObject, который предоставляет базовый метод init().

UIViewController inherited init methods diagram

Проблема, с которой вы столкнулись, связана с вызовом init(coder: при создании экземпляра ViewController из .xib или раскадровки. Этот метод вызывается для разархивирования объектов .xib/storyboard.

Из документации:

iOS инициализирует новый контроллер представления, вместо этого вызывая его метод initWithCoder:

Вы должны вызывать инициализатор, назначенный суперклассу, в вашем методе init, который является init(nibName:bundle) Примечание: хорошо, что оба эти параметра равны нулю. Также ваше переопределение init(coder:) должно вызывать super.init(coder:)

Ответ 2

Простым обходным путем будет:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}