Загрузка xib для UIViewController в ContainerView в раскадровке

У меня есть "контейнер" viewController, который содержит несколько видов контейнеров, используя раскадровку. каждый вид этого контейнера имеет ссылку на встроенный просмотр viewcontroller.

Так как im работает над большим проектом, получается, что файл раскадровки массивный и содержит много "детского" viecontrollers вида макета. это будет проблема, работающая над этим файлом, когда несколько человек должны работать одновременно на нем. и это не хорошо для меня. Я хотел бы знать, если theres способ загрузки в каждый контейнер просматривать viewController xib файл и все еще использовать раскадровку.

Значение, создавая .xib файлы для каждого диспетчера представлений вместо того, чтобы держать их в самой раскадровке, и связывать их с представлениями контейнера в раскадровке.

спасибо,

Ответ 1

Вы можете переместить макет контроллера вида в отдельный xib. Как вы говорите, это очень удобный способ обмена макетами в раскадровках.

При настройке представления контейнера в раскадровке убедитесь, что удалить предоставленное представление во встроенном ViewController. Задайте настраиваемый класс для ViewController для вашего имени класса. Назовите xib для соответствия классу (например, FooViewController.xib, чтобы его можно было найти при загрузке FooViewController.m.)

Если вы не удалите View в макете диспетчера представлений раскадровки, вы увидите это пустое представление. Ваш метод viewDidLoad в вашем контроллере просмотра не будет вызываться, потому что представление является стандартным представлением раскадровки.

Я использую Xcode 6.1 для iOS 8 в проекте pre-iOS 7.

Ответ 2

Да, вы можете. Несколько наблюдений:

  • Все, что вам нужно сделать, - это ввести код, который мы использовали при использовании NIB. В случае контейнеров это означает типичные методы контейнера. Если вы не сделали сдерживания через код, см. Создание настраиваемых контроллеров просмотра контейнеров в Руководстве по программированию контроллера просмотра. Итог, когда вы переходите на сцену без сценарной сцены (или добавляете контроллер детского представления без раскадровки), просто введите код так, как вы всегда использовали в среде на основе NIB. Вы не можете представить эту сцену на основе NIB в раскадровке. Но вы просто получаете контроллер, как вы всегда делаете с NIB:

    SecondViewController *controller = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
    
  • Очевидно, вы потеряете многие преимущества использования раскадровки (например, размер детской сцены на основе представления контейнера в родительской сцене), но вы не хуже, чем в среде NIB. Но в ответ на ваш вопрос о том, можете ли вы "связать их с представлениями контейнера в раскадровке", вы не можете представлять эти отношения в самой раскадровки, а скорее программно соединить их.

  • Если ваши отдельные команды работают в среде с одним сценарием, вы можете использовать этот подход NIB. Вы должны также подумать о том, что у вас есть несколько раскадровки, по одному для каждой логической команды. Вам все равно придется прибегать к коду при переходе между раскадными страницами, как и в этом подходе NIB, но если у одной из ваших команд есть несколько сцен, с которыми можно справиться, они могут наслаждаться преимуществами раскадровки в рамках своей части проекта. Когда вы хотите попасть в первую сцену на следующем раскадровке, вы можете:

    UIStoryboard *secondaryStoryboard = [UIStoryboard storyboardWithName:@"SecondStoryboard" bundle:nil];
    SecondViewController *controller = [secondaryStoryboard instantiateInitialViewController];
    
  • Если вашему ребёнку необходимо перейти на новую сцену на раскадровке, мне будет полезно добавить собственное свойство parentStoryboard к моему дочернему контроллеру, что тогда полезно, если вам нужно сделать что-то вроде instantiateViewControllerWithIdentifier. Очевидно, что если вы не переходите к новым контроллерам, вам может и не понадобиться это делать, но если вы имеете, свойство UIStoryboard может быть полезным.