У меня есть UIViewController
, который выглядит немного как это:Инстанцирование из ViewControllers из раскадровки в Swift
class ProfileViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, ... {
...
convenience init(name: String) {
print("Init with student: \(name)")
self.init()
}
...
}
У меня есть соответствующий раскадровки макет для этого, встроенный в UINavigationViewController, связанный с UITabBarController. Казалось, что это самый простой способ разработки макета, и отлично подходит, когда требуется только один экземпляр этого VC (именно так было создано приложение).
Теперь я хотел бы создать несколько вкладок из этого единственного проекта (между 1 и 3) и передать информацию об инициализации VC программно, но я не уверен точно, как это сделать - как вы можете видеть выше. Я добавил функцию инициализации удобства, основанную на некоторых чтениях, которые я сделал, поскольку это казалось хорошим местом для начала.
Это достаточно легко создавать новые именованные вкладки на основе раскадровки макета, как это:
for user in (users)! {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "profileNC")
controller.tabBarItem.title = user.name
newTabs?.insert(controller, at: 0)
}
self.viewControllers = newTabs
Но, делая это таким образом я не получаю, чтобы вызвать функцию инициализации передать UIViewController
в нем информация должен отображаться правильно.
Как я могу создать свои ViewControllers, связать макет с раскадрой и использовать пользовательскую функцию init? Возможно ли это?
Любые предложения с благодарностью оценили !!
Просто для того, чтобы понять, почему вы хотите вызвать свой собственный init при создании своего UIViewController. Я имею в виду, какое ограничение вызывает создание пользовательского инициализатора? –
Следуя за ответом @ Paulw11, я понял, что могу просто создать экземпляр NC, получить дочерний VC, бросить как «ProfileViewController», а затем установить переменную напрямую, что кажется разумным подходом - или, по крайней мере, это работает до сих пор! Первоначально я думал, что ViewDidLoad будет вызван до того, как я установил переменную, поэтому мне нужно будет использовать пользовательский Init, но при отражении это было немного глупо; Вид не совпадает с классом. – Ben