Перейти на іншу розкадровку?


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
Мені просто хочеться тримати роздільні дошки; вони вже дуже захаращені.
Ри-

11
Як і у розділах книги, я бачу необхідність у декількох розкладачах.
finneycanhelp

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

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

1
Дивіться відповідь milczi, ви можете зробити це зараз дуже легко в інтерфейсі!
Тім

117

Починаючи з Xcode 7, ви можете це зробити графічно, використовуючи довідку із розгортки:

довідник

Додайте посилання на аркуші розкадрування до вашої розкадровки. Створіть виразку між ViewController та довідковою сторінкою (ctrl + перетягування)

Потім заповніть ці поля.

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

Якщо "Підручник" - це файл "Tutorial.storyboard", а "MainTutorialController" - це ваше поле "Ідентифікатор розгортки" у ViewControllerSettings


1
Хороша інформація, проте питання позначено ios5, тому це не стосується.
lnafziger

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

Це доступно від XCode 7 і далі. Дивіться більше інформації на сайті stackoverflow.com/questions/30772145/…
Simon Pickup

Це спрацювало, але мені також потрібно зберегти навігаційну панель, вона відображається без навігаційної панелі, чи є можливість зберегти навігацію та кнопку, щоб повернути її назад в історію, неважливо, з якої дошки вона складається?
Гіл Бейрут

Це працює для мене в 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
злиття рекламних дощок працює не дуже добре, тож у середовищі, що займається розробниками, може бути цікаво використовувати окремі розкадровки. Крім того, продуктивність може стати дуже поганою у великих проектах з єдиною розкадровкою.
calimarkus

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

3
У моєму випадку проблема продуктивності зазвичай в Xcode ... Поточна реалізація редактора розкадрівки Apple слабка.
Адам

1
Розгорнутий на 60 сценах сценарій займає 13 секунд, щоб відкрити Mac 2014 Pro. Я подав РЛС.
Роберт Аткінс

7

Не слід розміщувати UITabBarControllers в контролері UINavigationController. Він запитує про помилки, такі як неправильна авторотація / вивантаження перегляду тощо, оскільки Apple не підтримує такий тип утримання:

Однак при поєднанні контролерів перегляду важливий порядок утримання; діють лише певні домовленості. Порядок утримання, від дитини до батька, такий:

  • Контролери перегляду вмісту та контролери перегляду контейнерів, які мають гнучкі межі (наприклад, контролер перегляду сторінки)
  • Контролер подання навігації
  • Контролер панелі вкладок
  • Роздільний контролер перегляду

1
Я повністю згоден і з кількох причин. Розміщення TabBarController всередині NavigationController - це не дуже гарна ідея, тому що делегати не запускатимуть належним чином для переглядів, що містяться всередині них, і кінцевому користувачеві буде страшний час навігації по інтерфейсу. Їм важко буде повернутися до контролера, який веде з інтерфейсу TabBar / Navigation. Навпаки, все в порядку, NavigationController всередині TabBarController. Завжди краще не плутати кінцевого користувача та слухати пропозиції Apple!
Хуберт Куннемейер

1
І все-таки рідне додаток iPhone Music робить саме це (частина "Зараз грає").
Енцо Тран

FYI: У музичній програмі iPhone немає TabbarController на екрані "Зараз грає".
sanjana

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.