2012-02-10 19 views
67

Estoy tratando de crear un mecanismo para profundizar en una lista de archivos/carpetas. La idea es mostrar el mismo controlador de vista de lista de archivos cada vez que el usuario selecciona una carpeta, y mostrar un controlador de visualización de detalles de archivo si él/ella selecciona un archivo.Storyboard Segue From View Controller to Itself

Hasta el momento, han creado un segue de la vista del controlador de lista de archivos para el controlador de vista detallada de archivos, y una transición suave de la lista de archivos vista de tabla celda a la de la lista de archivos de controlador de vista de tabla:

enter image description here

El problema con esto es que tan pronto como el usuario toca la celda, se ejecuta la transición. Me gustaría eliminar el segue de la celda de vista de tabla y hacer una desde el controlador de vista de lista de archivos a sí mismo. De esa forma, podría desencadenar la transición correcta programáticamente cuando el usuario tocara la celda.

Entonces, mi pregunta es: ¿es posible crear un segue desde un controlador de vista a sí mismo en el Interface Builder?

+1

Sí, utilizando xcode 5 puede. [ver publicación] (http://stackoverflow.com/questions/9226983/storyboard-segue-from-view-controller-to-itself/23436265#23436265). –

+0

Abra el menú Editor, haga clic en 'Mostrar contorno del documento', luego simplemente arrastre con el botón derecho de la celda al objeto' ViewController' de la lista de archivos del esquema. –

Respuesta

25

Desarrollé un método para crear un segue usando un botón fantasma. Creo que resolverá tu problema. Puedes leer sobre esto en mi respuesta here.

+4

Esto me puso en el camino correcto. Agregué un botón en el "Dock" y lo conecté al controlador de vista de lista de archivos. Ahora puedo realizar el cambio programáticamente como yo quería. ¡Gracias! – Jorge

+1

Ojalá esto no fuera necesario solo para obtener una auto-seguación, pero esto funciona. – jogloran

+2

La solución de Mustafa es menos hacky y bastante sencilla. Hacer cambios a las mismas vistas con botones fantasmas solo hará que tu guión gráfico sea un desastre. – strada

23

En lugar de realizar una transición al mismo controlador, puede instanciar un controlador de vista (el mismo) del guión gráfico, y luego presionarlo en el controlador de navegación.

+0

Me gusta la solución de botón fantasma. Todas mis transiciones avanzadas pasan por prepareForSegue: en lugar de recordar si se crea una transición en IB o código. –

40

Si está utilizando un controlador de navegación, debe presionar ViewController en la pila de navegación. En este ejemplo, nombré a mi ViewController "VDI" en mi configuración de Storyboard Storyboard.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"]; 
[self.navigationController pushViewController:dest animated:YES]; 

Si no desea que el NavigationController a seguir añadiendo sí en su historia "Volver" que puede hacer estallar la pila antes de añadir a ella como tal.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"]; 
UINavigationController *navController = self.navigationController; 
[navController popViewControllerAnimated:NO]; 
[navController pushViewController:dest animated:YES]; 
+0

Ambos métodos uno y @TJ/@ Jorge funcionarán. He ido por este camino porque se siente más limpio. Las ventajas que puedo ver en el otro método son que puede ver los bucles en el guión gráfico, y que puede manejar toda su navegación en "prepareForSegue:" – siburb

+1

¡Funcionó a la perfección! Además, esa es la "ID de Storyboard" en XCode que estableció en "VDI" para aquellos que buscan recrear esto. – Nerrolken

13

En IOS 6, se a cleaner solution que el uso de un botón fantasma. Todavía se puede definir el segue de la celda de la tabla a la vista controlador, y mirar el remitente para cancelar la segue disparado automáticamente:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    //storyboards should use segues and override prepareForSegue instead 
    //but here we need custom logic to determine which segue to use 
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    if (item meets condition) { 
     [self performSegueWithIdentifier:@"segue1" sender:self]; 
    } else { 
     [self performSegueWithIdentifier:@"segue2" sender:self]; 
    } 
} 

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { 
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath 
    return (sender == self); 
} 
0

Espero que esto ayude.

Encontré que puede crear varias celdas de prototipos.

Que puede vincular cada celda (en el guión gráfico) a una vista diferente.

Algo como esto:

NSString *CellIdentifier = @"Cell"; 
if (Condition2){ 
CellIdentifier = @"Cell2"; } 
if (Condition3){ 
CellIdentifier = @"Cell3"; } 
27

Uso de Xcode 5 hay una solución mucho más simple .

  1. Haga clic en la celda de la tabla en el guión gráfico
  2. abrir el inspector de conexiones (flecha hacia la derecha en la parte superior derecha)
  3. En "disparado segues" ve "selección"
  4. Arrastre desde el círculo junto para "seleccionar" a la celda en el guión gráfico

Eso es todo.

+2

Este enfoque funciona como un amuleto sin línea de código. –

+2

Esta es * la * respuesta correcta para xcode 5+ y en estos días debe usar un segue "mostrar" para esto. – CupawnTae

+2

Parece que no funciona para mí, el controlador de vista no se vuelve "azul" para permitir agregar el segue. – db0

3

Así es como se puede empujar otra instancia del controlador de vista actual sin definir un segue o codificar su propio identificador:

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier]; 
[self.navigationController pushViewController: same animated: YES]; 

Sólo tiene que poner la identificación de restauración a ser el mismo que Storyboard ID (hay una casilla de verificación para eso en IB).

Restoration ID

4

enfoque Interface Builder: Just ramificarse a una referencia guión gráfico que se refiere de nuevo a la vista controlador de presentación.

+1

¡Este enfoque es el mejor si se realiza otra navegación con segues en IB! ¡Gracias! –

0

La respuesta correcta es utilizar una referencia del guion gráfico que hace referencia al UIViewController que desea seguear sobre sí mismo y, a continuación, señalar el segue en él.

enter image description here

Cuestiones relacionadas