Я не использую UIViewController
из раскадровки, и я хочу иметь настраиваемую init
функцию, в которую я передаю NSManagedObjectID
некоторый объект. Я просто хочу звонить, super.init()
как в Objective-C. Как это:
init(objectId: NSManagedObjectID) {
super.init()
}
Но я получаю следующую ошибку компилятора:
Должен вызывать назначенный инициализатор суперкласса UIViewController
Могу я просто больше не делать этого?
источник
initWithCoder:
исходит изNSCoding
протокола ... Я до сих пор не могу понять, какова его роль в инициализации экземпляра UIViewController, является ли он "назначенным" инициализатором UIViewController или любого из его суперклассов ... .let
свойств, если таковые имеются:super.init(nibName: nil, bundle: nil)
.Еще одно приятное решение - объявить ваш новый инициализатор в качестве
convenience
инициализатора следующим образом:convenience init( objectId : NSManagedObjectID ) { self.init() // ... store or user your objectId }
Если вы вообще не объявляете никаких назначенных инициализаторов в своем подклассе, они наследуются автоматически, и вы можете использовать их
self.init()
в своем удобном инициализаторе.В случае UIViewController метод инициализации по умолчанию будет вызывать
init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
сnil
обоих аргументов (Command-Click на UIViewController даст вам эту информацию).TL; TR : Если вы предпочитаете программно работать с
UIViewController
s, вот полный рабочий пример, который добавляет новый инициализатор с настраиваемым аргументом:class MyCustomViewController: UIViewController { var myString: String = "" convenience init( myString: String ) { self.init() self.myString = myString } }
источник
myString
устанавливается в""
такinit
не требуется. Это решение развалится, если вы не хотите использовать начальное значение, и в этом случае вам нужно его использовать,self.init(nibName: nil, bundle:nil)
myString
собственность необязательнойЧтобы улучшить ответ оккулуса :
init() { super.init(nibName: nil, bundle: nil) }
источник
Обновление: добавьте ссылку
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init
Согласно документации для iOS, назначенным инициализатором для UIViewController является
initWithNibName: bundle:
.Сделать это можно следующим образом:
init(objectId : NSManagedObjectID) { super.init(nibName: (xib's name or nil'), bundle: nil) // other code... }
или же
Объявите новый инициализатор как удобный инициализатор:
convenience init( objectId : NSManagedObjectID ) { self.init() // other code...
}
источник