Используйте init в подклассе - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть суперкласс, ViewController

class ViewController : UIViewController { /* no init here */ }

И у меня много ViewController, которые наследуют форму ViewController. Например, этот

class AddHoraire : ViewController { /* I want an init for this class */ }

Могу ли я инициировать подкласс?Он спрашивает меня тоже требуется init я нажал на исправить, но мне нужно написать, что это такое?

Вот ошибка: http://www.noelshack.com/2018-52-7-1546133576-93491c85-f2eb-4b8a-bfff-35ae5763c59a.jpeg

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

При попытке инициализации,

init(SelectedDay: String) {
    super.init()
    selectedDay = SelectedDay
}

вы получаете сообщение об ошибке: «Вы должны вызвать назначенный инициализатор суперкласса ViewController»

Поскольку вы не определили указанный инициализатор вViewController, вы наследуете назначенный инициализатор его суперкласса UIViewController, который равен init(nibName: String?, bundle: Bundle?).

Чтобы исправить это, добавьте инициализатор к ViewController.Пусть это вызовет назначенный инициализатор.Вам также придется применить исправление-it для генерации init?(coder:).

class ViewController: UIViewController {
    init() {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Затем вернемся к AddHoraire, я предполагаю, что у вас есть свойство selectedDay.Это должно быть установлено до вызова super.init().Я бы также рекомендовал не использовать заглавные буквы в имени параметра.Просто используйте то же имя и различайте параметр и свойство, используя self. для идентификации свойства.

class AddHoraire : ViewController {
    private let selectedDay: String

    init(selectedDay: String) {
        self.selectedDay = selectedDay
        super.init()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
0 голосов
/ 30 декабря 2018

Обычно вы не определяете новые инициализаторы для подклассов UIViewController.Для этого потребуется переопределить init(coder:) и init(nibName:, bundle:) с этими точными подписями и, следовательно, не будет возможности предоставить значения для ваших пользовательских свойств.

Добавьте функцию настройки в ваш пользовательский VC и упомяните в документации, что онадолжен быть вызван до того, как VC будет готов к использованию:

class AddHoraire : ViewController {
    var anInt: Int!
    var aString: String!

    /// This method must be called before this class is ready for use
    func setup(anInt: Int, aString: String) {
        loadViewIfNeeded() // in case you need to access the outlets
        self.anInt = anInt
        self.aString = aString
    }
}

Использование:

let vc = AddHoraire()
vc.setup(anInt: 42, aString: "Hello world")
...