Почему я не могу вызвать по умолчанию super.init() на UIViewController в Swift?
Я не использую UIViewController из StoryBoards, и я хочу иметь пользовательскую функцию init, где я передаю NSManagedObjectID некоторого объекта. Я просто хочу назвать super.init(), как в объективе c. Вот так:
init(objectId : NSManagedObjectID) {
super.init()
}
Но я не могу с этим скомпилировать. Могу ли я просто не делать этого больше?
Сообщение об ошибке компилятора, которое я получаю: "должен вызывать назначенный инициализатор супервизора uiviewcontroller"
Ответы
Ответ 1
Назначенный инициализатор для UIViewController
равен initWithNibName:bundle:
. Вы должны называть это вместо этого.
См. http://www.bignerdranch.com/blog/real-iphone-crap-2-initwithnibnamebundle-is-the-designated-initializer-of-uiviewcontroller/
Если у вас нет низа, перейдите в nil
для nibName (пакет также является необязательным). Затем вы можете создать пользовательское представление в loadView
или добавив subviews в self.view
в viewDidLoad
, как и раньше.
Ответ 2
Еще одно приятное решение - объявить новый инициализатор как инициализатор convenience
следующим образом:
convenience init( objectId : NSManagedObjectID ) {
self.init()
// ... store or user your objectId
}
Если вы вообще не укажете назначенные инициализаторы в своем подклассе, они наследуются автоматически, и вы можете использовать self.init()
в своем удобном инициализаторе.
В случае UIViewController метод init по умолчанию вызовет init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
с nil
для обоих аргументов (Command-Click на UIViewController предоставит вам эту информацию).
TL; TR. Если вы предпочитаете программно работать с UIViewController
, вот полный рабочий пример, который добавляет новый инициализатор с настраиваемым аргументом:
class MyCustomViewController: UIViewController {
var myString: String = ""
convenience init( myString: String ) {
self.init()
self.myString = myString
}
}
Ответ 3
В соответствии с документацией для iOS назначенным инициализатором для UIViewController является initWithNibName: bundle:
.
Если вы подклассифицируете UIViewController, вы должны вызвать супер реализацию этого метода, даже если вы не используете NIB.
Вы можете сделать это следующим образом:
init(objectId : NSManagedObjectID) {
super.init(nibName: (xib name or nil'), bundle: nil)
// other code...
}
или
Объявить новый инициализатор в качестве инициализатора удобства:
convenience init( objectId : NSManagedObjectID ) {
self.init()
// other code...
}
![]()
Ответ 4
Чтобы улучшить ответ оккулуса:
init() {
super.init(nibName: nil, bundle: nil)
}