2011-12-05 13 views
13

Estoy escribiendo una aplicación de iPhone basada en un guión gráfico y trabajando en la restauración del estado. Cuando realizo los segmentos normalmente, quiero que sean animados, pero cuando restauro varios niveles de una jerarquía de navegación, solo quiero que la última transición sea animada. Además de configurar dos conjuntos de segues, un conjunto que usa una seguación de inserción normal y otro que usa una seguación de inserción personalizada no animada, ¿hay alguna manera de lograr lo que estoy tratando de hacer?Pulsar segue sin animación

Respuesta

14

Es posible manipular directamente la pila del controlador de vista, independientemente de los segmentos o guiones gráficos de la aplicación.

Puede utilizar esta técnica para restablecer una gran cantidad de controladores de visualización y realizar/animar solo un solo cambio al controlador de vista superior. (Es probable que necesite crear un segmento de inserción específico para este fin).

Por ejemplo, para restablecer una pila de controlador de dos vistas, podría hacer lo siguiente. En este ejemplo, se supone que alguna acción en un controlador de vista existente conduce a la restauración del estado, pero puede realizarlo con la misma facilidad desde su delegado de la aplicación.

[self performSegueWithIdentifier:@"Page2Express" sender:self]; 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"Page2Express"]) 
    { 
     // Get any state data you need to from Core Data 
     CoreDataType *valuePulledFromCoreData = // ... 

     // Set up the page 2 view controller as you normally would 
     Page2ViewController *page2ViewController = segue.destinationViewController; 
     page2ViewController.instanceVariable = valuePulledFromCoreData; 

     // Create a loose, page 1 view controller and set it up as required 
     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
     Page1ViewController *page1ViewController = [storyboard instantiateViewControllerWithIdentifier:@"Page1ViewController"]; // Ensure you have this identifier set up in your storyboard 
     page1ViewController.instanceVariable = valuePulledFromCoreData; 

     // Add the page 1 view controller to the top of the navigation stack (to be later obscured in the segue by the page 2 view controller) 
     NSMutableArray *viewControllers = [[self navigationController].viewControllers mutableCopy]; 
     [viewControllers addObject:page1ViewController]; 
     [self navigationController].viewControllers = viewControllers; 
    } 
} 

Si, por el contrario, prefiere no tener animaciones, entonces es aún más fácil. Puede restablecer el estado únicamente manipulando la pila del controlador de vista (y sin utilizar ningún segue) desde - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions y - (void)applicationWillEnterForeground:(UIApplication *)application.

De cualquier forma funcionará a la perfección y en conjunto con su (s) storyboard (s) existente (s) y segues.

+0

Recién salido de interés, ¿existe alguna razón por la que manipule la matriz 'viewControllers' en lugar de usar' pushViewController: animated: '? –

+4

'pushViewController: animated:' no solo agrega un controlador de vista a la pila, sino que también actualiza la vista para mostrar ese controlador de vista. En este caso, no queremos ver el 'page1ViewController', ni siquiera brevemente, así que tenemos que agregarlo directamente a la pila. –