Перейти к другой раскадровке?


133

Можно ли переходить от одной раскадровки к другой или вставлять раскадровку в контроллер представления в другую раскадровку? Мне нужно поместить UITabBarControllerв UINavigationController, и я хотел бы, чтобы они были красивыми и отдельными.


1
Посмотрите на этот ответ stackoverflow.com/a/19702425/317928
vokilam

5
Отличный вопрос Одна раскадровка - это кошмар для командных проектов. Мы регулярно разбиваем проекты на раскадровки «потоком» (одна раскадровка для входа в систему, одна раскадровка для подачи новостей и связанных с ними экранов и т. Д.). Это помогает минимизировать количество конфликтов слияния, которые в противном случае возникали бы каждый раз, когда разработчик прикасался к раскадровке.
Брайан Сашетта

@BrianSachetta Что еще вы делаете? Любые другие хорошие подобные советы, чтобы поделиться?
Мёд

Это зависит от вашей команды. Если вы действительно хотите, вы можете иметь все свои пользовательские интерфейсы в отдельных файлах .xib. Так было до появления раскадровок. У этого подхода есть свои плюсы и минусы. Плюс в том, что вы почти никогда не будете конфликтовать с другими разработчиками проекта. Недостатком является то, что приложение может быть трудно увидеть визуально.
Брайан Сашетта

Ответы:


201

Да, но вы должны сделать это программно:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];

11
Я просто очень хочу разделить раскадровки; они уже слишком загромождены.
Ry-

11
Как и главы в книге, я вижу необходимость в нескольких раскадровках.
finneycanhelp

48
Когда над одним приложением работают несколько разработчиков, становится очень полезно иметь несколько раскадровок, потому что разрешение конфликтов управления версиями в раскадровке xml иногда довольно болезненно.
Ли

14
В iOS 9 и Xcode 7 теперь поддерживаются ссылки на раскадровки. :-)
Куинн Тейлор

1
Смотрите ответ Милчи, вы можете сделать это сейчас очень легко в пользовательском интерфейсе!
Тим

117

Начиная с Xcode 7, вы можете сделать это графически с помощью Storyboard Reference:

ссылка

Добавьте ссылку на раскадровку на свою раскадровку. Создать переход между ViewController и Storyboard Reference (Ctrl + перетаскивание)

Затем заполните эти поля.

введите описание изображения здесь

Где "Tutorial" - это файл "Tutorial.storyboard", а "MainTutorialController" - это ваше поле "Storyboard ID" в ViewControllerSettings


1
Хорошая информация, однако вопрос помечен ios5, так что это не относится.
lnafziger

10
@Inafziger да, но этот вопрос появляется в верхней части результатов поиска людей, использующих iOS 9
Брайан Огден

Это доступно с XCode 7 и далее. См. Больше информации на stackoverflow.com/questions/30772145/…
Саймон Пикап

Это сработало, но мне также нужно сохранить панель навигации, которая отображается без панели навигации, есть ли способ сохранить навигацию и кнопку, чтобы переместить ее назад в историю, не имеет значения, из какой она раскадровки?
Гил Бейрут,

Это работает для меня в iOS 10. Я заметил, что мне нужна одна ссылка на раскадровку для каждого перехода, и я не могу подключить несколько сегментов к одной контрольной точке.
Марк Рейд

10

Вы не можете делать сегменты вручную, потому что UIStoryboardSegue является абстрактным классом. Вам нужно создать его подкласс и реализовать performдля того, чтобы он что-то делал. Они действительно предназначены для создания раскадровок. Вы можете нажать контроллер представления вручную, что является хорошим решением. Ответ lnafziger делает это хорошо:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

Однако следует отметить, что вы сказали, что хотите, чтобы все было хорошо и обособленно. Идея раскадровки состоит в том, чтобы вы могли держать вещи отдельно, одновременно выполняя все свои дизайнерские работы в одном месте. Каждый контроллер представления хорош и отделен в раскадровке от других. Вся идея состоит в том, чтобы держать все это в одном месте. Просто выложите это красиво, чтобы оно было организовано, и вам будет хорошо идти. Вы не должны отделять это, если у вас нет действительно веской причины для этого.


6
объединение раскадровок не очень хорошо работает, поэтому в среде с несколькими разработчиками было бы интересно использовать отдельные раскадровки. Также производительность может сильно ухудшиться в больших проектах с одной раскадровкой.
Калимаркус

1
Мы используем несколько раскадровок, но дело в том, что вы не можете сделать это и переключаться между ними. Apple спроектировал его так, чтобы вы могли делать все в одном месте, поэтому идея состоит в том, чтобы использовать только один (не то, что вы не можете). Производительность не должна быть проблемой. Раскадровка компилируется в отдельные файлы пера для каждого контроллера представления. Вы должны получить очень хорошую производительность от раскадровки. Производительность будет такой же хорошей, как если бы у вас были отдельные xibs для каждого контроллера представления.
wbyoung

3
В моем случае проблема с производительностью обычно в Xcode ... Текущая реализация редактора раскадровок в Apple слабая.
Адам

1
60-сценная раскадровка занимает 13 секунд, чтобы открыть на Mac Pro 2014 года. Я подал радар.
Роберт Аткинс

7

Вы не должны помещать UITabBarControllers в UINavigationController. Он запрашивает ошибки, такие как неправильная автоповорот / выгрузка представления и т. Д., Так как Apple не поддерживает такого рода ограничения:

Однако при объединении контроллеров представления важен порядок локализации; действительны только определенные договоренности. Порядок содержания от ребенка к родителю выглядит следующим образом:

  • Контроллеры представления содержимого и контроллеры представления контейнера, имеющие гибкие границы (например, контроллер представления страницы)
  • Контроллер навигационного представления
  • Контроллер панели вкладок
  • Контроллер с разделенным видом

1
Я полностью согласен и по нескольким причинам. Поместить TabBarController внутри NavigationController не очень хорошая идея, потому что делегаты не будут корректно запускаться для представлений, содержащихся в них, и конечному пользователю будет ужасно сложно перемещаться по интерфейсу. Им будет трудно вернуться к контроллеру, который выходит из интерфейса TabBar / Navigation. И наоборот, все в порядке, NavigationController внутри TabBarController. Всегда лучше не путать конечного пользователя и слушать предложения Apple!
Хуберт Куннемейер

1
И все же родное приложение iPhone Music делает именно это (часть «Сейчас играет»).
Энцо Тран

К вашему сведению: музыкальное приложение iPhone не имеет TabbarController на экране «Сейчас играет».
Санжана,

4

Вот быстрая версия:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}

-1

Вы пробовали следующее:

2 / нажмите, чтобы выбрать контроллер представления, который связан с вашим контроллером навигации и в верхнем меню: редактор -> встроить -> контроллер панели вкладок

Примечание: я не проверял это, потому что я использую противоположное: создание приложений панели вкладок и размещение контроллера навигации внутри).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.