Подтвердить что ты не робот

Почему я не могу вызвать по умолчанию super.init() на UIViewController в Swift?

Я не использую UIViewController из StoryBoards, и я хочу иметь пользовательскую функцию init, где я передаю NSManagedObjectID некоторого объекта. Я просто хочу назвать super.init(), как в объективе c. Вот так:

init(objectId : NSManagedObjectID) {
    super.init()
}

Но я не могу с этим скомпилировать. Могу ли я просто не делать этого больше?

Сообщение об ошибке компилятора, которое я получаю: "должен вызывать назначенный инициализатор супервизора uiviewcontroller"

4b9b3361

Ответ 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)
}