2012-03-05 4 views
121

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

+1

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

+4

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

+0

@BrianSachetta Что еще вы делаете? Любые другие хорошие аналогичные советы? – Honey

ответ

192

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

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

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

+9

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

+46

Когда у вас несколько разработчиков, работающих с одним и тем же приложением, становится очень полезно иметь несколько раскадровки, потому что разрешение конфликтов управления версиями в xml-файле раскадровки довольно болезненно. – Lee

10

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

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

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

+6

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

+1

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

+3

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

7

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

When combining view controllers, however, the order of containment is important; only certain arrangements are valid. The order of containment, from child to parent, is as follows:

  • Content view controllers, and container view controllers that have flexible bounds (such as the page view controller)
  • Navigation view controller
  • Tab bar controller
  • Split view controller
+1

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

+1

И все же родное приложение для iPhone iPhone делает именно это (часть «Now Playing»). –

+0

FYI: приложение для iPhone не имеет TabbarController на экране «Сейчас играет». – sanjana

-1

вы попробуйте следующее:

2/выберите ваш контроллер представления, который связан к вашему контроллеру навигации и в верхнем меню: editor -> embed in -> Контроллер панели таблеток

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

96

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

reference

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

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

enter image description here

Где "Учебное пособие" является файл "Tutorial.storyboard" и "MainTutorialController" ваше поле "Раскадровка ID" в ViewControllerSettings

+1

Это отлично работает! Лучший ответ на многое! – Tim

+1

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

+10

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

4

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

let targetStoryboardName = "Main" 
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil) 
if let targetViewController = targetStoryboard.instantiateInitialViewController() { 
    self.navigationController?.pushViewController(targetViewController, animated: true) 
} 
Смежные вопросы