ios - Storyboard Segue From View Controller to Itself
uitableview uiviewcontroller (9)
Estoy tratando de crear un mecanismo para desglosar 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.
Hasta ahora, he creado un paso del controlador de vista de lista de archivos al controlador de vista de detalles de archivo, y un paso de la celda de vista de tabla de lista de archivos al controlador de vista de tabla de lista de archivos:
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?
A continuación, le indicamos cómo puede enviar otra instancia del controlador de vista actual sin definir un intervalo ni una codificación física de su propio identificador:
SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];
Solo necesita configurar la ID de restauración para que coincida con la ID del guión gráfico (hay una casilla para eso en IB).
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 .
En IOS 6, hay una solución más limpia que usar un botón fantasma. Aún puede definir la transición desde la celda de la tabla al controlador de vista, y mirar al remitente para cancelar la transición automática desencadenada:
- (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);
}
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.
Enfoque de Interface Builder: simplemente pase a una referencia del guión gráfico que hace referencia al controlador de vista que se está presentando.
Espero que esto ayude.
Descubrí que puedes crear varias células prototipo.
Entonces puedes 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"; }
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 NavigationController continúe agregándose a su historial "Atrás", puede abrir la pila antes de agregarla 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];
Usando Xcode 5 hay una solución mucho más simple.
- Haga clic en la celda de la tabla en el guión gráfico
- Abra el Inspector de conexiones (icono de flecha a la derecha en la esquina superior derecha)
- En "segues activados" ves "selección"
- Arrastre desde el círculo al lado de "selección" a la celda en el guión gráfico
Eso es.