Pregunta

Necesito ayuda para elegir la solución 'correcta' para el siguiente 'problema'.

Utilizo la nueva función del guión gráfico para vincular todas las pantallas de mi aplicación. Básicamente, la estructura perfora a:

Controlador de navegación] => [Ver controlador #1] => [Tabbar Controller] => [Ver controlador #2]*

** (y algunas otras pestañas que por ahora no son importantes)*

He conectado un Segue (Push) desde el primer controlador de vista (#1) al controlador de vista detrás del controlador de la barra de pestaña. Este empuje se activa cuando los usuarios presionan algo en el primer controlador y funciona bien.

// Execute preset segue
[self performSegueWithIdentifier:@"segueEventDetail" sender:self];

Cuando el usuario (que ahora se encuentra en el controlador de vista #2) presiona el botón Atrás en el Navbar, el usuario se remonta. Supongamos que ahora desencadena el segue nuevamente, el segundo controlador de vista se muestra nuevamente pero ahora se 'reasbeado' (vacío). (Creo que después de leer varios foros y artículos, ¿este es un comportamiento estándar cuando se usa Segue porque destruyen y reinician el controlador de vista cada vez?)

Esto (el controlador de vista que se está reiniciando) plantea un problema porque el contenido del segundo controlador de vista es dinámico (depende de una respuesta JSON del servidor) y, por lo tanto, es "necesario" que el controlador de vista permanezca intacto (o se restaure) cuando El usuario regresa.

He encontrado varias fuentes (ver fondo) que describen el mismo problema, pero las soluciones varían y necesito ayuda para elegir la correcta.

Resumir:

  • ¿Cómo puedo 'conservar'/guardar el estado de un controlador de vista cuando los usuarios presionan hacia atrás, mientras preservan el uso de guiones gráficos y preferiblemente también segue's

Pensamientos propios:

#1 Ahora estoy pensando en almacenar en caché la respuesta JSON a mi clase de singleton (y desde allí a una plist) y verificar dentro del segundo controlador de vista si estos datos están presentes y luego reconstruir la vista después de lo cual verifique cualquier nuevo datos (reanude normal. operación).

#2 Otro en el que estoy pensando es 'pasar' el segue y manejar manualmente el interruptor de vistas, parcialmente explicado en (Storyboard: consulte ViewController en AppDelegate) - ¿Es esto también posible?

¿Pero tal vez hay una opción más fácil/mejor?

http://www.iphonedevsdk.com/forum/iphone-sdk-development/93913-retining-data- when-using-storyboards.html Storyboard: consulte ViewController en AppDelegate ¿Cómo serializar una vista UIView?

¿Fue útil?

Solución 2

Para cualquiera que se encuentre con esta (mi) pregunta en el futuro, así es como terminé 'codificándolo'.

  • Abra el guión gráfico y seleccione su 'Controlador de barra de pestaña' y abra el Inspector de Atributos

  • Complete un 'identificador' en el campo

  • Con el primer controlador de vista (ver escenario en la publicación original) creo una referencia global al ViewController:

FirstViewController.h

@interface YourViewController : UIViewController {

    UITabBarController *tabController;

}

FirstViewController.m

//Fill the reference to the tabcontroller using the identifier
tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];

Ahora para cambiar de FirstViewController, se puede usar la siguiente línea:

[[self navigationController] pushViewController:tabController animated:YES];

Otros consejos

¡Sí! Tengo la solución. Haz lo siguiente:

En su archivo .h:

@property (strong, nonatomic) UITabBarController *tabController;

En su archivo .m:

@synthesize tabController;

tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];

El índice seleccionado es la pestaña a la que desea ir

tabController.selectedIndex = 1;

[[self navigationController] pushViewController:tabController animated:YES];

Esta podría ser una solución aún más simple (sin usar propiedades; de hecho, todas sus instancias de clase no necesitan saber sobre sus controladores de destino, así que simplemente guárdelo como estático en la función de empuje):

static UIVewController *destController = nil;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
if (!storyboard) {
    DLog(Storyboard not found);
    return;
}
if (destController == nil) { //first initialisation of destController
    destController = [storyboard instantiateViewControllerWithIdentifier:@"{Your Destination controller identifyer}"];
    if(!destController) {
        DLog(destController not found)
        return;
    }
}
//set any additional destController's properties;
[self.navigationController pushViewController:destController animated:YES];

PD DLog es solo mi variación de NSLog.

¿Pero es realmente interesante cómo hacer esto con Segue?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top