Сэге на другой раскадровки?

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

Ответ 1

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

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

Ответ 2

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

reference

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

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

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

Где "Учебник" - это файл "Tutorial.storyboard" и "MainTutorialController" - это поле "Идентификатор раскадровки" в ViewControllerSettings

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

2/щелкните, чтобы выбрать контроллер вида, который связан с вашим контроллером навигации и в верхнем меню: editor → embed in → Controlbar bar

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