2012-05-01 25 views
5

Zaimplementowałem niestandardowe rozwiązanie UITabBar dla projektu. Zasadniczo, jeśli istnieje więcej niż 5 elementów, używam scrollView, który pozwala użytkownikowi przewijać dodatkowe pozycje tabulatorów i eliminuje przycisk więcej. Podobny wygląd można zobaczyć w aplikacji Weather Channel.Tłumienie moreNavigationController w niestandardowym UITabBarController

Każdy element paska kart odpowiada elementowi UINavigationController, który zarządza stosem widoków dla każdej karty. Problem, który mam, gdy mam więcej niż 5 elementów tabulatora, na karcie 5 nie działa poprawnie stos nawigacyjny. Wygląda na to, że im więcejNavigationController zabija stos nawigacyjny za każdym razem, gdy wrócisz do tej karty i ponownie przejdziesz na stronę początkową.

mam przesłonięte metody setSelectedViewController następująco:

- (void) setSelectedViewController:(UIViewController *)selectedViewController { 
    [super setSelectedViewController:selectedViewController]; 
    if ([self.moreNavigationController.viewControllers count] > 1) { 
     self.moreNavigationController.viewControllers = [[NSArray alloc] initWithObjects:self.moreNavigationController.visibleViewController, nil]; 
    } 
} 

Ten kod usunie większą funkcjonalność na przycisku nawigacyjnym po lewej stronie, ale to nie rozwiązuje problemu utrzymania stos nawigacji. Wszystkie pozostałe zakładki działają dobrze. Mogę przejść przez kilka widoków, a stos zostanie utrzymany po wyjściu i powrocie do tej karty. Rozumiem, że jest to skomplikowany problem, więc proszę o informację, czy są obszary, w których mogę zapewnić jasność. Dzięki!

Odpowiedz

5

ten sposób skończyło się to mocowania:

- (void) setSelectedViewController:(UIViewController *) selectedViewController { 
    self.viewControllers = [NSArray arrayWithObject:selectedViewController]; 
    [super setSelectedViewController:selectedViewController]; 
} 

zasadzie dowolną kartę z 5 na dostaje swój kontroler nawigacyjny zastąpiony przez moreNavigationController kiedy intiially ustawić viewControllers na UITabBarController. Dlatego dynamicznie ustawiam viewControllers tak, aby zawierał tylko kartę, którą kliknę. W tym przypadku nigdy nie będzie więcej niż 1, więc więcejNavigationController nie wchodzi w grę.

Po uruchomieniu kontrolera niestandardowego dostarczam tylko pierwszą kartę jako kontrolery viewController, aby aplikacja mogła zostać załadowana.

- (id) init { 
    self = [super init]; 
    if (self) { 
     self.delegate = self; 
     [self populateTabs]; 
    } 
    return self; 
} 

- (void) populateTabs { 
    NSArray *viewControllers = [self.manager createViewsForApplication]; 
    self.viewControllers = [NSArray arrayWithObject:[viewControllers objectAtIndex:0]]; 
    self.tabBar.hidden = YES; 
    MyScrollingTabBar *tabBar = [[MyScrollingTabBar alloc] initWithViews:viewControllers]; 
    tabBar.delegate = self; 
    [self.view addSubview:tabBar]; 
} 

Dla przejrzystości, uczestnik tabBar jest ustawiony na tę klasę, aby mógł odpowiadać na kliknięcia tab. Metoda delegata jest następująca:

- (void) tabBar:(id) bar clickedTab:(MyScrollingTabBarItem *) tab { 
     if (self.selectedViewController == tab.associatedViewController) { 
     [(UINavigationController *) tab.associatedViewController popToRootViewControllerAnimated:YES]; 
    } else { 
     self.selectedViewController = tab.associatedViewController; 
    } 
    // keep nav label consistent for tab 
    self.navigationController.title = tab.label.text; 
} 
+1

Zrobiłem to całkiem inaczej, ale wykorzystałem twoją koncepcję tylko umieszczenia pierwszego ViewController i załadowania wszystkich innych dynamicznie. Ładnie wykonane! – Marquis103

Powiązane problemy