8

In meinem iPhone App wiederherstellen zuvor angezeigten Registerkarte auf Start habe ich den SetSelectedIndex: (auch versucht setSelectedViewController: wie pro docs, aber ohne Erfolg)UITabBarController: Umschalten auf einen anderen View-Controller programmatisch

Dies funktioniert auf iPhone OS 3.0 - jedoch wird unter OS 2.x der ausgewählte Index größer als 3 (die ersten 4 Tabs) nicht auf die gewünschte Ansicht umgeschaltet. Dies wird von Apple hier dokumentiert: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/selectedViewController

Ich frage mich, ob es möglich ist, zu einem View-Controller unter iPhone OS 2.x zu wechseln? Jede Hilfe wird geschätzt.

Btw auf meinem Simulator Einstellung Index größer als 3 wirft einen Fehler (für iPhone OS 2.x) - so habe ich dies in einer @try {..} @catch (id ..) {} Block - Hoffnung verpackt Diese Technik hilft jemandem.

Antwort

2

Ich habe diese Arbeit an Version 2.

Mein Code sitzt hier und arbeitet sehr schön.

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

// Add the tab bar controller's current view as a subview of the window 
[[UIApplication sharedApplication] setIdleTimerDisabled:YES]; 

[application setStatusBarStyle:UIStatusBarStyleBlackOpaque]; 
[window addSubview:tabBarController.view]; 
// Settings getLastViewIndex is just, 0,1,2,3 depending on what it was last set. 
tabBarController.selectedIndex = [Settings getLastViewIndex]; 
+0

ja, die selectedIndex-Eigenschaft funktioniert in iPhone OS 2.x, aber es funktioniert nicht, wenn der Index größer ist als 3. Mein iPhone App über 12 Registerkarten. –

2

Die UITabBarController docs über selectedIndex es buchstabieren:

Diese Eigenschaft stellt nominell einen Index in das Array der viewControllers Eigenschaft. Allerdings wenn der ausgewählte View-Controller ist derzeit die Mehr Navigation Controller Diese Eigenschaft enthält den Wert NSNotFound. Wenn Sie diese -Eigenschaft einstellen, wird die ausgewählte Ansicht -Steuerung in den mit gekennzeichneten Index im viewControllers Array geändert. Um den Mehr Navigationscontroller selbst auszuwählen, müssen Sie stattdessen den Wert der selectedViewController Eigenschaft ändern.

In Versionen von iPhone OS vor Version 3.0 spiegelt diese Eigenschaft der Index der nur Artikel Tab-Leiste ausgewählt. Der Versuch, diesen Wert auf einen Index einer View-Controller einzustellen, die nicht sichtbar in der Tab-Leiste ist, sondern stattdessen durch den Mehr Navigation Controller verwaltet, hat keine Wirkung.

Wenn ich richtig verstehe, müssen Sie stattdessen auf „den Wert der selectedViewController Eigenschaft ändern“, aber Sie werden nur so weit, wie die Auswahl des Mehr nav-Controller, kein VC innerhalb es. Aus den gleichen Dokumenten in Bezug auf selectedViewController:

Dieser View-Controller ist derjenige, deren benutzerdefinierte Ansicht derzeit von die Tableiste Schnittstelle angezeigt wird.Der angegebene View Controller muss sich im Array viewControllers befinden. Das Zuweisen eines neuen View-Controllers zu dieser Eigenschaft ändert die aktuell angezeigte Ansicht und wählt auch eine entsprechende Registerkarte in der Registerkartenleiste aus. Das Ändern der Ansicht Controller aktualisiert auch die Eigenschaft entsprechend. Der Standardwert dieser Eigenschaft ist nil.

In iPhone OS 3.0 und höher können Sie mit dieser Eigenschaft in dem Viewcontrollers Eigenschaft eine der View-Controller auszuwählen. Dieser enthält View-Controller, die verwaltet werden, durch die Weitere Navigation Controller und deren Tab-Leiste Elemente sind nicht in der Tab-Leiste sichtbar. Sie können verwenden sie auch die Mehr Navigation Controller selbst zu wählen, die erhältlich von der moreNavigationController Eigenschaft ist. Vor iPhone OS 3.0, könnten Sie wählen Sie nur die Mehr Navigation Controller und die Teilmenge der Ansicht Controller, dessen Element Tableiste war sichtbar. Der Versuch, diese -Eigenschaft auf einen Ansichtscontroller zu setzen, dessen Registerkartenelement nicht sichtbar war, hatte keinen Effekt.

Wie für dieses Problem zu umgehen, frage ich mich, wenn die Mehr nav der Steuerung pushViewController:animated: Methode hier würde sich als nützlich? Geben Sie jeder Ansicht eine eindeutige Tag-Nummer (die Sie hinter den Kulissen einer entsprechenden VC zuordnen können). Speichern Sie das Tag für den zuletzt aktiven VC.

Wählen Sie zur Startzeit die entsprechende Ansicht in der Registerkarte Controller aus. Wenn das Tag der Ansicht den VCs für die ersten vier Registerkartenelemente nicht zugeordnet ist, muss es innerhalb des More Nav-Controllers liegen. Suchen Sie den VC, schieben Sie ihn auf den More Stack des Nav-Controllers und wählen Sie dann den More nav Controller outright.

Ich habe das nicht versucht, aber es könnte ein Experiment wert sein! Das einzige potentielle Gotcha (und es könnte ein biggie sein) ist, dass Sie müssen das VC nach die Weitere Nav-Controller ist Setup, nicht vorher.

+1

Diese Erklärung hat sehr geholfen.Einfaches Setzen des selectedIndex funktioniert nicht, wenn die Anzahl der Tabs größer als 5 ist und wenn der selectedIndex> 5 ist. Aber das Setzen des selectedViewControllers auf den viewController funktioniert wie ein Charm. –

7

Vielleicht wird dies helfen. Was ich getan habe, war den Index des ausgewählten Tab-Bar-Elements zu speichern. Wenn die App gestartet wird, überprüfe ich, ob die Nummer größer als 3 ist. Wenn es der Fall ist, setze ich den ausgewählten Tab-View-Controller als den mehr Navigations-Controller und dann den gespeicherten Index-Tab-View-Controller von dem mehr Navigations-Controller.

if ([[WSFUserDefaults sharedInstance] savedTabBarLocation] > 0) { 

      if ([[WSFUserDefaults sharedInstance] savedTabBarLocation] > 3) { 
       UIViewController *selectViewController = [tabBarController.viewControllers objectAtIndex:[[WSFUserDefaults sharedInstance] savedTabBarLocation]]; 
       [tabBarController setSelectedViewController:tabBarController.moreNavigationController]; 
       [tabBarController.moreNavigationController popToRootViewControllerAnimated:NO];//make sure we're at the top level More 
       [tabBarController.moreNavigationController pushViewController:selectViewController animated:NO]; 
      } 
      else { 
       [tabBarController setSelectedIndex:[[WSFUserDefaults sharedInstance] savedTabBarLocation]]; 
      } 
     } 
+0

Das funktioniert gut. Was passiert, wenn Sie selectedIndex setzen, ist, dass mehr Controller anstelle des ursprünglichen Navigationscontrollers verwendet wird und dann dynamisch zurückgeschaltet wird. Dieser Code ruft die ursprüngliche Einstellung donee auf und stellt sicher, dass der navigationController-Zeiger des Ansichtscontrollers korrekt ist. –

+0

Hmm. Es funktioniert gut mit einem Problem: Die Schaltfläche Bearbeiten auf dem Bildschirm Mehr ist weg. –