Przenieść się do innego storyboardu?


133

Czy można przejść z jednej scenorysu do drugiej lub osadzić scenorys w kontrolerze widoku w innej planszy? I należy umieścić UITabBarControllerw sposób UINavigationController, i chciałbym je zachować ładny i rozdzielić.


1
Spójrz na tę odpowiedź stackoverflow.com/a/19702425/317928
vokilam

5
Świetne pytanie. Posiadanie jednego storyboardu to koszmar dla projektów zespołowych. Regularnie dzielimy projekty na scenorysy według „przepływu” (jeden scenorys do logowania, jeden scenorys do kanału wiadomości i powiązanych ekranów itp.). Pomaga zminimalizować liczbę konfliktów scalania, które w przeciwnym razie wystąpiłyby za każdym razem, gdy programista dotyka scenorysu.
Brian Sachetta

@BrianSachetta Czym jeszcze się zajmujesz? Jakieś inne dobre, podobne wskazówki, którymi warto się podzielić?
Honey

To zależy od struktury Twojego zespołu. Jeśli naprawdę chcesz, możesz mieć wszystkie interfejsy użytkownika w oddzielnych plikach .xib. Tak było, zanim powstały storyboardy. Takie podejście ma swoje plusy i minusy. Plusem jest to, że prawie nigdy nie będziesz mieć konfliktów z innymi programistami w projekcie. Wadą jest to, że wizualne widzenie przepływu aplikacji może być trudne.
Brian Sachetta

Odpowiedzi:


201

Tak, ale musisz to zrobić programowo:

// 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
Naprawdę chcę oddzielić scenorysy; są już zbyt zagracone.
Ry-

11
Podobnie jak rozdziały w książce, widzę potrzebę wielu scenorysów.
finneycanhelp

48
Gdy wielu programistów pracuje nad tą samą aplikacją, bardzo przydatne staje się posiadanie wielu scenorysów, ponieważ rozwiązywanie konfliktów kontroli wersji w pliku storyboard xml jest czasami dość bolesne.
Lee

14
W iOS 9 i Xcode 7 są teraz obsługiwane odwołania między scenorysami. :-)
Quinn Taylor

1
Zobacz odpowiedź Milcziego, możesz to teraz bardzo łatwo zrobić w interfejsie użytkownika!
Tim

117

Począwszy od Xcode 7, możesz to zrobić graficznie, używając odnośnika do scenorysu:

odniesienie

Dodaj odniesienie do scenorysu do swojej serii ujęć. Utwórz przejście między ViewController i Storyboard Reference (ctrl + drag)

Następnie wypełnij te pola.

wprowadź opis obrazu tutaj

Gdzie „Tutorial” to plik „Tutorial.storyboard”, a „MainTutorialController” to Twoje pole „Storyboard ID” w ViewControllerSettings


1
Dobra informacja, jednak pytanie jest oznaczone tagiem ios5, więc to nie dotyczy.
lnafziger

10
@Inafziger tak ale to pytanie pojawia się na górze wyników wyszukiwania dla osób korzystających z iOS 9
Brian Ogden

Jest to dostępne począwszy od XCode 7. Zobacz więcej informacji na stackoverflow.com/questions/30772145/…
Simon Pickup

To zadziałało, ale muszę też zachować pasek nawigacji, jest wyświetlany bez paska nawigacyjnego, czy istnieje sposób, aby zachować nawigację i przycisk, aby przenieść go z powrotem do historii, czy nie ma znaczenia, z jakiego scenariusza pochodzi?
Gil Beyruth

To działa dla mnie w iOS 10. Zauważyłem, że potrzebuję jednego odniesienia do scenorysu na każdy odcinek i nie mogę połączyć wielu fragmentów z jednym punktem odniesienia.
Mark Reid

10

Tak naprawdę nie można tworzyć seguesów ręcznie, ponieważ UIStoryboardSegue jest klasą abstrakcyjną. Musisz go podklasować i zaimplementować perform, aby mógł cokolwiek zrobić. Naprawdę mają być tworzone w scenorysach. Możesz jednak nacisnąć kontroler widoku ręcznie, co jest dobrym rozwiązaniem. Odpowiedź Lnafzigera dobrze to robi:

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

Należy jednak zauważyć, że powiedziałeś, że chcesz, aby wszystko było ładne i oddzielne. Ideą storyboardów jest umożliwienie oddzielenia rzeczy podczas wykonywania wszystkich prac projektowych w jednym miejscu. Każdy kontroler widoku jest ładny i oddzielony w serii ujęć od innych. Chodzi o to, aby wszystko było w jednym miejscu. Po prostu ułóż to ładnie, aby było uporządkowane i będziesz gotowy. Nie powinieneś go rozdzielać, chyba że masz naprawdę dobry powód, aby to zrobić.


6
łączenie scenorysów nie działa zbyt dobrze, więc w środowisku z wieloma programistami interesujące może być użycie oddzielnych scenorysów. Również wydajność może się pogorszyć w dużych projektach z pojedynczym scenorysem.
calimarkus

1
Używamy wielu scenorysów, ale chodzi o to, że tak naprawdę nie możesz tego zrobić i przejść między nimi. Apple zaprojektował go tak, abyś mógł zrobić wszystko w jednym miejscu, więc pomysł jest taki, aby użyć tylko jednego (nie znaczy to, że nie możesz). Wydajność nie powinna być problemem. Scenorys jest kompilowany w osobnych plikach końcówek dla każdego kontrolera widoku. Powinieneś uzyskać bardzo dobrą wydajność z storyboardów. Wydajność będzie tak dobra, jakbyś miał oddzielne pliki xib dla każdego kontrolera widoku.
wbyoung

3
W moim przypadku problem z wydajnością występuje zwykle w Xcode ... Obecna implementacja edytora storyboardów firmy Apple jest słaba.
Adam

1
Storyboard z 60 scenami trwa 13 sekund do otwarcia na komputerze Mac Pro z 2014 roku. Złożyłem radar.
Robert Atkins,

7

Nie należy umieszczać UITabBarControllers w UINavigationController. Pyta o błędy, takie jak niepoprawna autorotacja / wyładowanie widoku itp., Ponieważ Apple nie obsługuje tego rodzaju powstrzymywania:

Jednak przy łączeniu kontrolerów widoku ważna jest kolejność zawierania; obowiązują tylko niektóre ustalenia. Kolejność zawierania, od dziecka do rodzica, jest następująca:

  • Kontrolery widoku zawartości i kontrolery widoku kontenera, które mają elastyczne granice (takie jak kontroler widoku strony)
  • Kontroler widoku nawigacji
  • Kontroler paska kart
  • Kontroler widoku podzielonego

1
Całkowicie się zgadzam i to z wielu powodów. Umieszczenie TabBarController wewnątrz NavigationController nie jest dobrym pomysłem, ponieważ delegaci nie uruchomiliby poprawnie widoków w nich zawartych, a użytkownik końcowy będzie miał straszny czas na nawigację po interfejsie. Trudno byłoby im wrócić do kontrolera, który wychodzi z interfejsu TabBar / Navigation. Z drugiej strony jest OK, a NavigationController wewnątrz TabBarController. Zawsze najlepiej nie mylić użytkownika końcowego i słuchać sugestii jabłek!
Hubert Kunnemeyer

1
A jednak natywna aplikacja iPhone Music robi dokładnie to (część „Teraz odtwarzane”).
Enzo Tran

Do Twojej wiadomości: aplikacja muzyczna na iPhone'a nie ma TabbarController na ekranie „Teraz odtwarzane”.
sanjana

4

Oto szybka wersja:

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

-1

czy próbowałeś następujących rzeczy:

2 / kliknij, aby wybrać kontroler widoku, który jest połączony z kontrolerem nawigacji iw górnym menu: edytor -> osadzenie w -> kontroler paska zakładek

Uwaga: nie testowałem tego, ponieważ używam odwrotnego działania: tworzenia aplikacji z zakładkami i umieszczania kontrolera nawigacji w środku).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.