Kontroler paska kart wewnątrz kontrolera nawigacyjnego lub współdzielenie widoku głównego nawigacji

Próbuję zaimplementować interfejs użytkownika podobny do aplikacji Tweetie , który zachowuje się tak: kontroler widoku najwyższego poziomu wydaje się być kontrolerem nawigacyjnym, którego głównym widokiem Jest widok tabeli "konta". Jeśli klikniesz na dowolne konto, przechodzi do drugiego poziomu, który ma pasek kart na dole. Każdy element karty pokazuje inną listę i pozwala Ci drążyć dalej(kolejne poziomy nie pokazują paska kart).

Wygląda więc na to, że hierarchia implementacji jest:

  • UINavigationController
    1. : UITableViewController
    2. UITabBarController
      1. Tweety : UITableViewController
        • szczegółowy widok tweeta / użytkownika / etc
      2. odpowiedzi : UITableViewController
      3. ...

To wydaje się działać [^1] , ale wydaje się być nieobsł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 API i tym podobnych, ale nie jestem pewien, dlaczego takie użycie jest wyraźnie zabronione, nawet jeśli wydaje się działać dobrze. Ktoś zna powód?

Myślałem o umieszczeniu kontrolera paska kart jako głównego kontrolera, z każdą z zakładek zawierających oddzielne Kontrolery nawigacyjne. Problem polega na tym, że każdy kontroler nav musi współdzielić jeden widok główny controller ( czyli tabela "Accounts" w Tweetie ) -- to chyba nie działa: przesunięcie kontrolera tabeli do drugiego kontrolera nav wydaje się usuwać go z pierwszego. Nie wspominając o całej księgowości przy wyborze innego konta prawdopodobnie będzie bolało.

Jak mam to wdrożyć we właściwy sposób?

[^1]: kontroler paska kart musi być podklasowany, aby element nawigacyjny kontrolera paska kart na tym poziomie był zsynchronizowany z wybranym element nawigacyjny tab i kontroler tabeli poszczególnych kart muszą przesunąć odpowiednie widoki szczegółów do self.tabBarController.navigationController zamiast self.navigationController.

Author: Daniel Dickison, 2009-02-23

9 answers

Dwie poprzednie odpowiedzi mają rację - nie używam UITabBarController W Tweetie. Dość łatwo jest napisać niestandardową XXTabBarController (zwykłą podklasę UIViewController), która cieszy się, że jest wepchnięta na stos kontrolerów nav, ale nadal żyje zgodnie z filozofią "kontrolera widoku". Każda "karta" w widoku konta(Tweets/Replies/Messages) jest własnym kontrolerem widoku i jeśli chodzi o to, że są one zamieniane na ekranie przez zwykły-ol UITabBarController.

 63
Author: atebits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-01 07:29:58

Buduję aplikację, która wykorzystuje podobny framework nawigacyjny do Tweetie. Napisałem post o tym jak to zrobić na moim blogu www.wiredbob.com {[2] } który również łączy się z kodem źródłowym. Jest to pełny szablon, który możesz wziąć i wykorzystać jako podstawę do innego projektu. Powodzenia!

 34
Author: Robert Conn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-10 21:41:36

Możliwe jest dodanie paska UITabBar do dowolnego kontrolera UIViewController. W ten sposób nie musisz naciskać kontrolera UITabBarController i dlatego pozostań w zgodzie z wytycznymi API Apple.

W interface builder UITabBar znajduje się pod "Windows, Views & Bars" w Bibliotece Cocoa Touch.

 10
Author: Himadri Choudhury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-23 07:59:56

Robię to w kilku moich aplikacjach. Sztuczka dodawania paska kart do aplikacji opartej na navigationController jest 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 kart, aby dodać dodatkowe widoki do widoku paska kart jako pod-widoki, aby przeładować widok tabeli z różnymi zestawami danych, aby przeładować UIPickerView, itp.

 9
Author: Alpinista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-23 17:00:40

Przez ostatnią godzinę zmagałem się z zaimplementowaniem UITabBar, ponieważ ukrywało się, gdy próbowałem wyświetlić mój widok; wtedy znalazłem ten post :

Zasadniczo, upewnij się, że wstawiasz nowy widok poniżej paska kart, zgodnie z tą linijką kodu:

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];
 6
Author: esilver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-01 07:30:51

W mojej aplikacji kontroler widoku głównego jest kontrolerem UINavigation. W pewnym momencie w aplikacji, muszę wyświetlić pasek 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 odkryłem, że chciałem więcej domyślnego zachowania, które zapewnia kontroler tab i znalazłem sposób na użycie kontrolera UITabBarController z kontrolerem UINavigation:

1) Gdy chcę wyświetlić UITabBarController ' s view, I do this:

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;
 3
Author: richardsun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-11 23:51:39

Tak to zrobiłem. To jest rzeczywiście pchanie tabbarcontroller na kontroler nawigacji. Działa dobrze. Nie znalazłem nigdzie w dokumentacji, że apple nie obsługuje w ten sposób. Czy ktoś może mi podać link do tego ostrzeżenia?

Jeśli to prawda, czy to możliwe, ż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];
}
 3
Author: savudin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 13:17:41

Można to osiągnąć po prostu osadzając TabBarController w kontrolerze nawigacyjnym. W storyboardzie:

  1. Przeciągnij kontroler widoku
  2. Kliknij na scenę Viewcontrollera
  3. Kliknij editor >> Embed in > > Navigation Controller.
  4. przeciągnij przycisk na tym samym Viewcontrolle.
  5. Przeciągnij TabBarController
  6. Podłącz przycisk ViewController do TabBarController za pomocą akcji push Segue.

W tym przypadku tylko TabBarController ' s RootViewController byłby w stosie kontrolera nawigacyjnego. Wszystkie TabBarItems będą miały pasek nawigacyjny u góry i 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 nawigacyjnego.

Jeśli to działa, podpowiedz mi, jak zwiększyć reputację, abym mógł zamieścić zdjęcia i kod w następnej odpowiedzi. :)

 2
Author: caffieneToCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-13 13:03:41

Napisałem post na blogu o tym, jak podszedłem do tego problemu. Dla mnie korzystanie z widoku modalnego było prostszym rozwiązaniem niż pisanie niestandardowej implementacji paska kart.

Http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/

 1
Author: Alex Medearis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-15 09:31:01