it-swarm.com.ru

Неустранимая ошибка: использование не реализованного инициализатора 'init (coder :)' для класса

Я решил продолжить свой оставшийся проект со Swift-language. Когда я добавил пользовательский класс (класс .Swift, который подкласс UIViewcontroller) в моем раскадровке viewcontroller и загрузил проект, внезапно произошел сбой приложения со следующей error :

фатальная ошибка: использование не реализованного инициализатора 'init (coder :)' для класса

Это код:

import UIKit

class TestViewController: UIViewController {

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // Custom initialization
    }

    override func viewDidLoad() {
        super.viewDidLoad()
              // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /*
    // #pragma mark - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
}

Пожалуйста, предложите что-нибудь,

145
Pratik Bhiyani

Вопрос

Это вызвано отсутствием инициализатора init?(coder aDecoder: NSCoder) на целевом UIViewController. Этот метод необходим, потому что его вызывает экземпляр UIViewController из UIStoryboard

Чтобы увидеть, как мы инициализируем UIViewController из UIStoryboard, пожалуйста, посмотрите здесь

Почему это не проблема с Objective-C?

Потому что Objective-C автоматически наследует все необходимые инициализаторы UIViewController.

Почему Swift не наследует инициализаторы автоматически?

Swift по умолчанию не наследует инициализаторы из-за безопасности. Но он унаследует все инициализаторы от суперкласса, если все свойства имеют значение (или необязательное), а подкласс не определил никаких назначенных инициализаторов.


Решение

1. Первый способ

Внедрение init?(coder aDecoder: NSCoder) вручную в цель UIViewController

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

2. Второй метод

Удаление init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) из вашей цели UIViewController унаследует все необходимые инициализаторы от суперкласса, как Dave Wood указал на его answer ниже


197
EridB

Другой вариант, кроме @ 3r1d, - вместо этого удалить следующий метод init из вашего класса:

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // Custom initialization
}

Включение этого метода init предотвращает наследование подклассом init(coder aDecoder: NSCoder!) от его суперкласса. Не включая его, ваш класс унаследует оба.

Примечание. См. Сессию 403 WWDC 2014 «Промежуточное стремительное движение» около отметки 33:50 для получения дополнительной информации.

25
Dave Wood

Для людей, имеющих ту же проблему с Swift UICollectionViewCells, добавьте код, предложенный @ 3r1d, в пользовательский класс UICollectionViewCell, а не в View Controller: 

init(coder aDecoder: NSCoder!)
{
    super.init(coder: aDecoder)
}
9
Nick Yap

Для тех, кому нужен код в Swift:

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

[Править] Это было для более старой версии Swift. Возможно, больше не работает.

3
MXV

У меня была эта проблема в программной ячейке collectionView, и хотя операционная система спрашивает о виртуальном канале, я все еще сталкиваюсь с этим вопросом при поиске ответа. Для меня проблема была у меня 

`required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}` 

реализовано так, что верхний ответ не сработал. В ячейке не было инициализатора:

// my programmatic cell was missing this
override init(frame: CGRect) {
    super.init(frame: frame)
}

Как только я добавил это, ошибка ушла

0
Lance Samaria

Вместо того, чтобы добавлять некоторые методы, чтобы заставить внутренний механизм работать нормально, я бы пошел с определением моих атрибутов как @lazy и инициализировал их прямо в области видимости класса. 

0
hasancan85