it-swarm.com.ru

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

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

131
Ry-

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

// 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];
200
lnafziger

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

reference

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

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

enter image description here

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

114
milczi

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

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

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

10
wbyoung

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

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

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

Вот версия Swift:

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