2012-05-01 15 views
5

Ich habe eine benutzerdefinierte UITabBar-Lösung für ein Projekt implementiert. Im Wesentlichen, wenn es mehr als 5 Elemente gibt, verwende ich eine scrollView, die es dem Benutzer ermöglicht, durch die zusätzlichen Registerkartenelemente zu blättern und die Schaltfläche "more" zu unterdrücken. Ein ähnliches Aussehen und Gefühl kann in der Weather Channel App gesehen werden.Unterdrücken Sie mehrNavigationController in benutzerdefinierten UITabBarController

Jedes Registerkartenelement entspricht einem UINavigationController, der den Stapel von Ansichten für jede Registerkarte verwaltet. Das Problem, das ich habe, ist, wenn ich mehr als 5 Tab-Elemente habe, ab Tab 5 nicht mehr korrekt den Navigations-Stack. Es scheint, dass der moreNavigationController den Navigationsstapel jedes Mal beendet, wenn Sie zu diesem Tab zurückkehren, und Sie werden wieder auf die Startseite gebracht.

ich die setSelectedViewController Methode überschrieben haben, wie folgt:

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

Dieser Code wird die mehr Funktionalität auf der linken Navigationstaste zu entfernen, aber es löst nicht das Problem des Navigationsstapels beibehalten wird. Alle anderen Registerkarten funktionieren einwandfrei. Ich kann mehrere Ansichten durchlaufen und der Stapel wird beibehalten, nachdem ich den Tab verlassen habe. Ich verstehe, dass dies ein kompliziertes Problem ist. Bitte lassen Sie mich wissen, wenn es Bereiche gibt, in denen ich Klarheit schaffen kann. Vielen Dank!

Antwort

5

Dies ist, wie ich diese Festsetzung endete:

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

Grundsätzlich kann jede Lasche von 5 auf seine Navigationssteuerung durch die moreNavigationController ersetzt wird, wenn Sie intiially die Viewcontrollers auf UITabBarController gesetzt. Daher setze ich ViewControllers dynamisch so, dass sie nur die Registerkarte enthalten, auf die ich klicke. In diesem Fall ist es nie mehr als 1, sodass der moreNavigationController nicht ins Spiel kommt.

Wenn ich meinen benutzerdefinierten Controller initiiere, stelle ich nur die erste Registerkarte als ViewControllers zur Verfügung, damit die Anwendung geladen werden kann.

- (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]; 
} 

Aus Gründen der Klarheit wird die tabBar Delegierten dieser Klasse gesetzt, so dass sie auf die Registerkarte klickt reagieren können. Die Delegate-Methode ist wie folgt:

- (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

Ich habe dies ein bisschen anders, aber verwendet Ihr Konzept der nur den ersten ViewController und laden Sie alle anderen dynamisch. Schön gemacht! – Marquis103

Verwandte Themen