Это невозможно, так как вы используете раскадровки. Когда вы создаете экземпляр ViewController из Storyboard с помощью метода instantiateViewController
, он использует required init?(coder aDecoder: NSCoder)
initializer.
Если вы хотите использовать свой собственный инициализатор, вам нужно избавиться от раскадровки и создавать UIViewController
только из кода или из xib
файла. Таким образом, вы сможете сделать это:
import UIKit
class B: UIViewController {
var name: String!
init(name: String) {
self.name = name
super.init(nibName: nil, bundle: nil) # or NIB name here if you'll use xib file
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Также вам необходимо указать init(coder...)
, поскольку каждый элемент пользовательского интерфейса может быть создан из Storyboard. Но вы можете оставить его с вызовом по умолчанию super
, поскольку вы не будете его использовать.
Другой вариант - использовать метод static
в ViewController из сообщения в начале вашего вопроса. Но на самом деле он также назначает переменные после инициализации ViewController.
Так что пока нет DI через инициализаторы. Я бы предложил использовать отдельный struct
для всех данных, которые нужно ввести в VC. Эта структура будет иметь все необходимые поля, поэтому вы не пропустите ни одного из них. И ваш типичный поток будет:
- Создание VC из раскадровки
- Instantiate
Data
struct
- Назначить данные для ВК
var data: Data!
- Использовать все введенные переменные из него