Почему переопределенные init (rootViewController) и init (nibName, bundle) требуются в подклассе UINavigationController? - PullRequest
2 голосов
/ 29 марта 2019

Я создал пользовательский UINavigationController:

class NavigationController: UINavigationController {

    override public init(rootViewController: UIViewController) {
        super.init(rootViewController: rootViewController)
    }

    public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

}

Затем я создаю подкласс:

final class CustomNavigationController: NavigationController {}

Но я получаю ошибку во время выполнения:

фатальная ошибка: использование неосуществленного инициализатора 'init (nibName: bundle :)' для класса 'CustomNavigationController'

Мне сказали, что это происходит потому, что эти init() действуют как удобные инициализаторы, и я должен реализовать их в подклассе, чтобы избежать сбоя.

Я не понимаю этого утверждения, так как попробовал что-то простое:

class Person {
    var name: String
    var age: Int
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    convenience init(tenYearsOldNamed name: String) {
        self.init(name: name, age: 10)
    }
}

class SubPerson: Person {}

let ben = SubPerson(tenYearsOldNamed: "Ben")

Это прекрасно работает, независимо от того, переопределяю я init(name, age) в SubPerson или нет.

Так что я не совсем понимаю, что происходит с этими UINavigationController единицами.

Спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...