Я решил продолжить мой оставшийся проект с помощью Swift-language. Когда я добавил пользовательский класс (класс .swift, который был подкласс для UIViewcontroller) в моем диспетчере просмотра раскадровки и загрузил проект внезапно с помощью приложения 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.
}
*/
}
Пожалуйста, предложите что-нибудь,
Это вызвано отсутствием инициализатора init?(coder aDecoder: NSCoder)
на целевом UIViewController
. Этот метод требуется, потому что он вызывает экземпляр a UIViewController
из a UIStoryboard
.
Чтобы узнать, как мы инициализируем UIViewController
из UIStoryboard
, пожалуйста, посмотрите здесь
Поскольку Objective-C автоматически наследует все необходимые инициализаторы UIViewController
.
Swift по умолчанию не наследует инициализаторы из-за безопасности. Но он наследует все инициализаторы из суперкласса, если все свойства имеют значение (или необязательное), и подкласс не определил никаких назначенных инициализаторов.
Вручную реализовать init?(coder aDecoder: NSCoder)
в целевом UIViewController
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
Удаление init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
на вашей цели UIViewController
наследует все необходимые инициализаторы из суперкласса, поскольку Dave Wood указывает на свой ответ ниже
Другим вариантом, кроме @3r1d, является вместо этого следующий метод init из вашего класса:
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialization
}
В том числе этот метод init, препятствует тому, чтобы подкласс был наследуем init(coder aDecoder: NSCoder!)
из своего суперкласса. Не считая этого, ваш класс наследует оба.
Примечание. Подробнее см. WWDC 2014 Session 403 "Intermediate Swift" примерно на отметке 33:50.
Для людей, имеющих такую же проблему с быстрым UICollectionViewCells
, добавьте код, который @3r1d предложил вашему пользовательскому классу UICollectionViewCell
, а не к контроллеру представления:
init(coder aDecoder: NSCoder!)
{
super.init(coder: aDecoder)
}
Для тех, кому нужен код в Swift:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
[Edit] Это было для старой версии Swift. Возможно, он больше не работает.
Вместо того, чтобы добавлять некоторые методы для работы внутреннего механизма, я хотел бы определить мои атрибуты как @lazy и инициализировать их прямо в области класса.
?
,
init(style: UITableViewStyle) { super.init(style: style) // Custom initialization }
Почему у нас может быть две функции init? И есть идеи, почему Apple не включает второй init по умолчанию?