Próbuję zaimplementować interfejs użytkownika o strukturze podobnej do aplikacji Tweetie , która zachowuje się tak: kontroler widoku najwyższego poziomu wydaje się być kontrolerem nawigacji, którego głównym widokiem jest widok tabeli „Konta”. Kliknięcie dowolnego konta powoduje przejście do drugiego poziomu, na którym u dołu znajduje się pasek kart. Każdy element karty przedstawia inną listę i pozwala na dalsze drążenie w dół (kolejne poziomy nie pokazują paska kart).
Wygląda więc na to, że hierarchia implementacji jest następująca:
UINavigationController
- Konta :
UITableViewController
UITabBarController
- Tweety :
UITableViewController
- Szczegółowy widok tweeta / użytkownika / itp
- Odpowiedzi :
UITableViewController
- ...
- Tweety :
- Konta :
Wydaje się, że to działa [^ 1], ale wydaje się, że nie jest obsługiwane zgodnie z dokumentacją SDK dla -pushViewController:animated:
(podkreślenie dodane):
viewController : kontroler widoku, który jest wypychany na stos. Nie może być instancją kontrolera paska kart.
Chciałbym unikać prywatnych interfejsów API i tym podobnych, ale nie jestem pewien, dlaczego takie użycie jest wyraźnie zabronione, nawet jeśli wydaje się działać dobrze. Czy ktoś zna powód?
Myślałem o umieszczeniu kontrolera paska zakładek jako głównego kontrolera, z każdą zakładką zawierającą oddzielne kontrolery nawigacji. Problem polega na tym, że każdy kontroler nawigacyjny musi współdzielić jeden główny kontroler widoku (mianowicie tabelę „Konta” w Tweetie ) - to nie działa: przeniesienie kontrolera tabeli do drugiego kontrolera nawigacyjnego wydaje się go usuwać od pierwszego. Nie wspominając o całej księgowości przy wyborze innego konta prawdopodobnie byłoby uciążliwe.
Jak mam to zaimplementować we właściwy sposób?
[^ 1]: Kontroler paska kart musi mieć podklasę, aby element nawigacyjny kontrolera paska kart na tym poziomie pozostawał zsynchronizowany z elementem nawigacyjnym wybranej karty, a kontroler tabeli pojedynczej karty musi przesyłać odpowiednie widoki szczegółów do self.tabBarController.navigationController
zamiast self.navigationController
.
źródło
Tworzę aplikację, która używa podobnej struktury nawigacji do Tweetie. Napisałem post o tym, jak to zrobić na moim blogu www.wiredbob.com, który również zawiera linki do kodu źródłowego. To pełny szablon, który możesz wykorzystać jako podstawę do innego projektu. Powodzenia!
źródło
Możliwe jest dodanie UITabBar do dowolnego UIViewController. W ten sposób nie musisz w rzeczywistości naciskać UITabBarController, a zatem przestrzegać wytycznych Apple API.
W kreatorze interfejsów UITabBar znajduje się w sekcji „Okna, widoki i bary” w bibliotece Cocoa Touch Library.
źródło
Robię to w kilku moich aplikacjach. Sztuczka polegająca na dodaniu paska kart do aplikacji opartej na navigationController polega na tym, aby NIE używać TabBarController. Dodaj pasek kart do widoku, ustaw kontroler widoku dla tego widoku jako TabBarDelegate i odpowiadaj na wybory użytkownika na pasku kart w kodzie kontrolera widoku.
Używam pasków zakładek, aby dodać dodatkowe widoki do widoku paska zakładek jako podwidoki, aby ponownie załadować widok tabeli z różnymi zestawami danych, aby ponownie załadować UIPickerView itp.
źródło
Przez ostatnią godzinę walczyłem z zaimplementowaniem a,
UITabBar
ponieważ ukrywał się, gdy próbowałem wyświetlić mój widok; wtedy znalazłem ten post :Zasadniczo upewnij się, że wstawiłeś nowy widok poniżej paska kart, zgodnie z tym wierszem kodu:
[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];
źródło
W mojej aplikacji główny kontroler widoku jest kontrolerem UINavigation. W pewnym momencie aplikacji muszę wyświetlić UITabBar. Próbowałem zaimplementować UITabBar na UIView w hierarchii nawigacji, jak sugerowały niektóre z poprzednich postów, i to działa. Ale stwierdziłem, że chcę więcej domyślnego zachowania, które zapewnia kontroler kart, i znalazłem sposób na użycie UITabBarController z kontrolerem UINavigation:
1) Kiedy chcę wyświetlić widok UITabBarControllera, robię to:
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; appDelegate.window.rootViewController = myUiTabBarControllerInstance;
2) Kiedy chcę wrócić do miejsca, w którym byłem w hierarchii nawigacji, robię to:
appDelegate.window.rootViewController = myNavControllerInstance;
źródło
Można to osiągnąć, po prostu osadzając TabBarController w kontrolerze nawigacji. W scenorysie:
W takim przypadku na stosie kontrolera nawigacji będzie tylko RootViewController TabBarControllera. Wszystkie TabBarItems miałyby pasek nawigacji u góry, a użytkownik może przejść do ekranu głównego w dowolnym momencie, niezależnie od wybranego TabBarItem
Można to zrobić w dowolnym kontrolerze ViewController w stosie kontrolera nawigacji.
Jeśli to zadziała, zasugeruj mi, jak zwiększyć reputację, abym mógł zamieścić zdjęcia i kod w następnej odpowiedzi. :)
źródło
Tak to zrobiłem. W rzeczywistości jest to umieszczenie kontrolera tabulacji na kontrolerze nawigacyjnym. To działa dobrze. Nigdzie w dokumentacji nie znalazłem, by Apple nie obsługiwał w ten sposób. Czy ktoś może mi podać link do tego ostrzeżenia?
Jeśli to prawda, czy możliwe jest, że Apple odmówi opublikowania mojej aplikacji w Appstore?
-(void)setArrayAndPushNextController { MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init]; MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init]; myFirstViewController.array = self.array; NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil]; UITabBarController *tab = [[UITabBarController alloc] init]; tab.viewControllers = array; [array release]; UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1]; UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2]; myFirstViewController.tabBarItem = item1; mySecondViewController.tabBarItem = item2; [self stopAnimatingSpinner]; [self.navigationController pushViewController:tab animated:YES]; [tab release]; [item1 release]; [item2 release]; }
źródło
Napisałem post na blogu, w jaki sposób podjąłem ten problem. Dla mnie korzystanie z widoku modalnego było prostszym rozwiązaniem niż pisanie niestandardowej implementacji paska z kartami.
http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/
źródło