2013-03-02 10 views
8

Sytuacja: dwa kontrolery UITabBarController, każdy z własnymi kartami, ale ostatnia karta w zarówno jest identyczna, więc chce jeden UIViewController, aby pokazać zawartość.Dwa kontrolery UITabBarController współdzielące jeden kontroler ViewController (w postaci zawartości karty)?

Problem w środowisku wykonawczym: Element udostępniony pojawia się tylko w jeden zestawów kart, gdy jest wyświetlany.

Pytanie: Czy ktoś wie, jak to działa?

Link do zewnętrznej grafiki ujęć konfiguracji: (Niestety, nie ma wystarczającej reputacji do zamieszczania zdjęć tutaj!) Storyboard graphic

projekt

Xcode z tym Storyboard: XCode Project

każdy element zawartości karty ma własną klasę UIViewController. Nie zawierają kodu poza linią do obsługi przycisków wstecz.

(Tak, wiem, że to dziwne. Prawdziwa sytuacja to aplikacja na iPada, w której kontrolery kart są wyświetlane w popover, a popoutery to "edytory właściwości", w których różne obiekty mają różne właściwości, ale wszystkie mają wspólny zestaw właściwości. w ten sposób jedna zakładka dla "unikalnych" rekwizytów, jedna udostępniona zawartość tabulatora dla "wspólnych" rekwizytów, które mają wszystkie obiekty.)

Znalazłem kilka sposobów obejścia tego, aby uzyskać pożądany efekt, ale jeśli ten scenariusz zadziałał byłoby to o wiele łatwiejsze rozwiązanie.

- Informacja, nieco niezwiązane z pytaniem -

Alternatywne rozwiązanie używam: TabBarControllers odwołuje się tylko do jednego VC jako zawartość zakładki. Kiedy ładuje się ta karta VC, używam kodu do (a) utworzenia współdzielonego VC z storyboardu za pomocą identyfikatora, (b) dodania tego nowego obiektu VC do TabBarController za pośrednictwem [tabController setViewControllers: list animated: NO].

(Innym możliwym rozwiązaniem Lubię nawet mniej.. Nie używając TabBarController i prezentuje zawartość VC z moim własnym „zakładki” graficzny wciągnąć w nich każda ukazuje „ja” jako wybrany Yuk)

Więc Mam działające rozwiązanie, jestem po prostu ciekaw, dlaczego to nie działa (tylko znana rzecz w API iOS lub jakieś magiczne ustawienie właściwości, które może sprawić, że będzie funkcjonować?)

+0

Uwaga podobne pytanie z innej ostrości (dziwne rzeczy dzieje się tam z tabel i widoków powtórnie wykorzystane i takie tam ...): http://stackoverflow.com/questions/8620619/uitabbarcontroller-storyboard-connecting-viewcontroller- thats-already-connecte? rq = 1 –

+0

Nie jestem pewien, co próbujesz osiągnąć. Rozwiązanie, w którym dodajesz drugą kartę w kodzie, można zrobić w scenorysie, po prostu kopiując współużytkowany kontroler i podpinając jedną instancję do każdego kontrolera paska kart. W obu scenariuszach otrzymujesz dwa różne wystąpienia kontrolera "współużytkowanego". – rdelmar

+0

Co staram się osiągnąć nie mając edytować układ UI w kilku kopiach „jeden” ujęć sceny, kiedy uzna, że ​​musi mieć inny kolor tła i układ przycisków. W tym przykładzie byłyby tylko dwie kopie. W mojej prawdziwej aplikacji będzie prawdopodobnie 10+, stąd chęć udostępnienia. Próbowałem uniknąć eksternalizacji interfejsu w pliki .XIB i ładowanie stamtąd, od tego od których scenorysy mają się oddalać. –

Odpowiedz

0

Nie można umieścić tego samego wyświetl instancję kontrolera w dwóch kontrolerach kart. Problem polega na tym, że instancja widoku (UIView) może mieć tylko jeden widok nadrzędny (superview). Podczas próby dodania kontrolera widoku do drugiej karty widok kontrolera widoku zostaje usunięty z pierwszego elementu nadrzędnego (pierwsza karta), a następnie dodany do drugiej karty.

+0

Nie zgadzam się, ale nie jestem pewien, że to jest źródło problemu. Cały przycisk TabBarController znika, a nie tylko widok. 2nd ViewController nigdy nie jest ustawiony w ogóle w drugiej tablicy TabeliController's ViewControllers. Prawdą jest, że [view addSubview: sub] powoduje, że subwoofer jest usuwany z dowolnego istniejącego widoku macierzystego jako efekt uboczny, problem wydaje się bardziej skomplikowany. Chciałbym uzyskać potwierdzenie, że implementacja Storyboard firmy Apple nie jest w stanie automatycznie utworzyć instancji dwóch instancji SharedViewController (tworząc dwa obiekty widoku). –

+0

Ponadto: tylko jeden kontroler TabBarController jest prezentowany na raz, więc dlaczego nie ma możliwości pełnego wykorzystania jednej instancji SharedViewController? Zgadzam się, że pojawiłyby się problemy z wyświetlaniem w dwóch miejscach jednocześnie, ale tak nie jest, chyba że API posiada pełny zestaw ViewController dla storyboardu w pamięci, gdy nie jest wyświetlany. To nie ma znaczenia, który wydaje się TabBarController pokazać pierwszy, więc to nie jest tak, gdy wykażą, że to jest „uzyskanie kontroli” z widokiem na i tak druga prezentacja później łapie widok z cudzego hierarchii. Tab jest * nigdy * pokazany w drugim kontrolerze TBController. –

0

Natknęłam się na twoją nić podczas uruchamiania tego samego wydania dzisiaj ... Rozwiązaniem jest utworzenie duplikatu kontrolera widoku na planszy fabularnej i dołączenie duplikatu do drugiego kontrolera paska kart. Po prostu to zrobiłem i działa ... Myślę, że "rdelmar" ma rację w tej sprawie ... skopiuj i ustaw to ... !!

+3

Tym samym tworząc koszmar aktualizowania kilkunastu kopii scenorysu za każdym razem, gdy chcesz zmienić układ. Duplikowanie rzeczy i używanie identycznych, ale wyraźnych kopii w wielu miejscach powoduje, że programista we mnie chce rzucić trochę ... :-) –

0

Dziś przebiegłem tę samą kwestię. Udało mi się wymyślić obejście, które może załatwić sprawę. Kluczem jest dodanie warstwy separacji między kartą i kontrolerem, którego chcesz ponownie użyć. Z każdego paska zakładek utworzyłem relację do odrębnego UIViewController z widokiem kontenera.Następnie możesz zrobić segregację 'embed' z kontenera do kontrolera, który chcesz ponownie wykorzystać jako widok kart. Nie jest tak czysty jak bezpośrednie połączenie (nie wiem, dlaczego nie jest to obsługiwane), ponieważ trzeba utworzyć klasę kontrolera dla każdego przypadku ponownego użycia. Jest to lepsze rozwiązanie niż koszmar związany z koniecznością duplikowania rzeczywistego widoku kart (jak również wszelkich dodatkowych widoków, które się z nim łączą) przy każdym użyciu.

Mam nadzieję, że to pomoże. Daj mi znać, jeśli ktoś potrzebuje więcej informacji.

+0

Oczywiście przeniosłem się (i kontynuowałem duplikowanie), ale myślę, że twoje rozwiązanie zadziała ... zakładając, że możesz mieć wiele "przychodzących" seców ebed dla kontrolera widoku treści. Masz rację, że jest to mniej bezpośrednie i powoduje ból, ponieważ kontroler kart nie może bezpośrednio odwoływać się do zawartości (która byłby kontrolerem widoku kontenera). Ale oczywiście nikt nie opublikował lepszego rozwiązania ... :-) –

Powiązane problemy