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ć
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
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.
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)
}
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.
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ął
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.
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