2017-02-03 4 views
0

У меня есть 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? Возможно ли это?

Любые предложения с благодарностью оценили !!

+0

Просто для того, чтобы понять, почему вы хотите вызвать свой собственный init при создании своего UIViewController. Я имею в виду, какое ограничение вызывает создание пользовательского инициализатора? –

+0

Следуя за ответом @ Paulw11, я понял, что могу просто создать экземпляр NC, получить дочерний VC, бросить как «ProfileViewController», а затем установить переменную напрямую, что кажется разумным подходом - или, по крайней мере, это работает до сих пор! Первоначально я думал, что ViewDidLoad будет вызван до того, как я установил переменную, поэтому мне нужно будет использовать пользовательский Init, но при отражении это было немного глупо; Вид не совпадает с классом. – Ben

ответ

3

При использовании раскадровки вы не можете использовать пользовательский инициализатор. Вам нужно будет либо установить свойство напрямую, либо использовать функцию конфигурации в экземпляре контроллера представления после его создания.

Смежные вопросы