tab bar iphone objective-c uinavigationcontroller uitabbarcontroller restore

iphone - UITabBarController: cambie a un controlador de vista diferente mediante programación



uitabbarcontroller swift 4 (3)

Tengo esto trabajando en la versión 2.

Mi código se encuentra aquí y funciona de maravilla.

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

En mi aplicación de iPhone, para restaurar la pestaña vista anteriormente, en el lanzamiento configuré setSelectedIndex: (también intenté setSelectedViewController: según los documentos, pero fue en vano)

Esto funciona en iPhone OS 3.0; sin embargo, en OS 2.x el índice seleccionado mayor que 3 (las primeras 4 pestañas) no cambia a la vista requerida. Esto está documentado por Apple aquí: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/selectedViewController

Me pregunto si es posible cambiar a un controlador de vista en iPhone OS 2.x? Cualquier ayuda es apreciada.

Por cierto, en mi índice de configuración del simulador mayor que 3 arroja un error (para iPhone OS 2.x) - así que he envuelto esto en un bloque @try {..} @catch (id ..) {} - espero que esta técnica ayude a alguien .


Los documentos UITabBarController sobre selectedIndex lo deletrean:

Esta propiedad nominalmente representa un índice en la matriz de la propiedad viewControllers . Sin embargo, si el controlador de vista seleccionado es actualmente el controlador de navegación Más , esta propiedad contiene el valor NSNotFound . Establecer esta propiedad cambia el controlador de vista seleccionado a uno en el índice designado en la matriz viewControllers . Para seleccionar el controlador de navegación más en sí, debe cambiar el valor de la propiedad ViewController selectedViewController lugar.

En las versiones de iPhone OS anteriores a la versión 3.0, esta propiedad solo refleja el índice de la barra de pestañas seleccionada. Intentar establecer este valor en un índice de un controlador de vista que no está visible en la barra de pestañas, pero que en cambio es administrado por el controlador de navegación Más , no tiene ningún efecto .

Si entiendo correctamente, necesita "cambiar el valor de la propiedad seleccionada ViewController" en su lugar, pero solo llegará a seleccionar el controlador More nav, no un VC dentro de él. De los mismos documentos con respecto a ViewController seleccionado :

Este controlador de vista es aquel cuya vista personalizada se muestra actualmente en la interfaz de la barra de pestañas. El controlador de vista especificado debe estar en la matriz viewControllers . La asignación de un nuevo controlador de vista a esta propiedad cambia la vista que se muestra actualmente y también selecciona una pestaña apropiada en la barra de pestañas. Cambiar el controlador de vista también actualiza la propiedad selectedIndex consecuencia. El valor predeterminado de esta propiedad es nil .

En iPhone OS 3.0 y posterior, puede usar esta propiedad para seleccionar cualquiera de los controladores de vista en la propiedad viewControllers . Esto incluye controladores de vista que son administrados por el controlador de navegación Más y cuyos elementos de barra de pestañas no están visibles en la barra de pestañas. También puede usarlo para seleccionar el controlador de navegación More , que está disponible desde la propiedad másNavigationController . Antes de iPhone OS 3.0, solo podía seleccionar el controlador de navegación Más y el subconjunto de controladores de vista cuyo elemento de barra de pestañas era visible. Intentar establecer esta propiedad en un controlador de vista cuyo elemento de barra de pestañas no era visible no tuvo ningún efecto.

En cuanto a una solución alternativa, me pregunto si el método pushViewController:animated: del controlador de pushViewController:animated: sería útil aquí? Dé a cada vista un número de etiqueta único (que podría asociar con un VC adecuado detrás de las escenas). Guarde la etiqueta para el VC que estuvo activo por última vez.

En el momento del inicio, seleccione la vista adecuada en el controlador de la barra de pestañas. Si la etiqueta de la vista no está asociada con los VC para los primeros cuatro elementos de pestañas, debe estar dentro del controlador More nav. Ubique el VC, empújelo en la pila del controlador Más nav, luego seleccione el controlador Más nav directamente.

No lo he intentado, pero podría valer la pena un experimento. El único problema potencial (y podría ser un problema) es que tendrás que presionar ese VC después de configurar el controlador de navegación más , no antes.


Tal vez esto ayude. Lo que hice fue guardar el índice del ítem de la barra de pestañas que se seleccionó. Cuando se inicia la aplicación, compruebo si el número es mayor que 3, si configuro el control de vista de la barra de pestañas seleccionada como el controlador de navegación más y luego presiono el controlador de vista de la barra de pestañas de índice guardado desde el otro controlador de navegación.

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