Можно ли переходить из одного раскадровки в другой или встраивать раскадровку в контроллер просмотра в другой раскадровки? Мне нужно разместить 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, вы можете сделать это графически, используя ссылку раскадровки:
Добавьте ссылку на раскадровку. Создайте 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
Примечание. Я не тестировал его, потому что я использую противоположное: создание приложений с вкладками и включение контроллера навигации внутри.)