Fatal error: use of unimplemented INIT(coder:) 'for class

Postanowiłem kontynuować mój pozostały projekt z Swift. Gdy dodam klasę niestandardową (podklasę UIViewcontroller) do kontrolera widoku storyboard i załaduję projekt, aplikacja zawiesza się nagle z następującym błędem:

Fatal error: use of unimplemented INIT(coder:) 'for class

To jest kod:

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.
    }
    */
}

Proszę coś zasugerować

Author: Lukas Würzburger, 2014-06-04

6 answers

Wydanie

Jest to spowodowane brakiem inicjalizatora init?(coder aDecoder: NSCoder) na celu UIViewController. Ta metoda jest wymagana, ponieważ wywołanie instancji a {[2] } z UIStoryboard wywołuje ją.

Aby zobaczyć, jak inicjalizujemy UIViewController z UIStoryboard, Proszę spojrzeć tutaj

Dlaczego to nie jest problem z Objective-C?

Ponieważ Objective-C automatycznie dziedziczy wszystkie wymagane inicjalizatory UIViewController.

Dlaczego Swift nie dziedziczy automatycznie inicjalizatory?

Swift domyślnie nie dziedziczy inicjalizatorów ze względu na bezpieczeństwo. Ale odziedziczy wszystkie inicjalizatory z klasy nadrzędnej, jeśli wszystkie właściwości mają wartość (lub opcjonalną), a podklasa nie zdefiniowała żadnych wyznaczonych inicjalizatorów.


Rozwiązanie

1. Pierwsza metoda

Ręczne wdrożenie init?(coder aDecoder: NSCoder) na celu UIViewController

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

2. Druga metoda

Usunięcie {[10] } na celu UIViewController odziedziczy wszystkie wymagane inicjalizatory z superklasy jako Dave Wood wskazał na swoją odpowiedź poniżej


 209
Author: E-Riddie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Inną opcją poza @3r1d jest usunięcie z klasy następującej metody init:

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

Włączając w to metodę init, zapobiega dziedziczeniu init(coder aDecoder: NSCoder!) przez klasę nadrzędną. Nie wliczając go, twoja klasa odziedziczy oba.

Uwaga: Zobacz WWDC 2014 Session 403 "Intermediate Swift" o znaku 33:50, aby uzyskać więcej szczegółów.

 26
Author: Dave Wood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-06 08:20:00

Dla osób mających ten sam problem z swift UICollectionViewCells, Dodaj kod sugerowany przez @3r1d do niestandardowej klasy UICollectionViewCell, a nie do kontrolera widoku:

init(coder aDecoder: NSCoder!)
{
    super.init(coder: aDecoder)
}
 10
Author: Nick Yap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-07 18:18:07

Dla potrzebujących kodu w Swift:

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

[edytuj] to było dla starszej wersji Swifta. Prawdopodobnie już nie działa.

 3
Author: MXV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-18 15:30:50

Miałem ten problem w komórce programmatic collectionView i mimo, że op pyta o vc, to i tak wylądowałem na tym pytaniu, szukając odpowiedzi. Dla mnie problemem było to, że miałem

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

Zaimplementowane, więc odpowiedź top nie działa. To czego nie miałem w komórce to inicjalizator:

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

Po dodaniu błędu zniknął

 3
Author: Lance Samaria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-29 12:52:48

Zamiast dodawać jakieś metody do poprawnego działania wewnętrznego mechanizmu, wybrałbym definiowanie moich atrybutów jako @lazy i inicjowanie ich bezpośrednio w class scope.

 1
Author: hasancan85,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 19:45:39