Soy bastante nuevo en xcode, y estoy intentando desarrollar una aplicación de muestra que básicamente es una tabla incorporada que tiene muchos niveles. Tengo un plist que almacena las celdas de cada tabla vista. Si las celdas no tienen hijos, entonces quiero poder ir a una vista detallada una vez que se presiona la celda. Eventualmente quiero poder ir a diferentes vistas detalladas dependiendo del tipo de datos. Para hacer esto, creé una vista detallada del guión gráfico, arrastré mi controlador de vista a mi vista detallada para crear un segue "Push" manual y etiqueté el segue "segue1".Creación manual de segue mediante storyboard y xcode
Editar: El código fuente here
siguiente que pueblan lo que supuse que las funciones necesarias para que esto funcione, lo que quiere llamar [self performSegueWithIdentifier:@"segue1" sender:myString];
donde miCadena es el título de la célula I seleccionado.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Check the dictionary to see what cell was clicked
NSDictionary *dict = [self.tableDataSource objectAtIndex:indexPath.row];
NSString *myString = [dict objectForKey:@"Title"];
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
NSArray *children = [dictionary objectForKey:@"Children"];
//If there is no children, go to the detailed view
if([children count] == 0)
{
[self performSegueWithIdentifier:@"segue1" sender:myString];
}
else{
//Prepare to tableview.
DrillDownViewController *rvController = [[DrillDownViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
//Increment the Current View
rvController.CurrentLevel += 1;
//Set the title;
rvController.CurrentTitle = [dictionary objectForKey:@"Title"];
//Push the new table view on the stack
[self.navigationController pushViewController:rvController animated:YES];
rvController.tableDataSource = children;
}
}
Finalmente, llamé a prepararse para segue el que busca el segue etiquetada SEGUE1.
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([[segue identifier] isEqualToString:@"segue1"])
{
DrillDownDetailController *dvController = [[segue destinationViewController] visibleViewController];
//DrillDownDetailController *dvController = [[DrillDownDetailController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
[dvController setItemName:(NSString *)sender];
[self.navigationController pushViewController:dvController animated:YES];
}
}
pensé que esto iba a funcionar, pero por alguna razón, cada vez que el código alcanza [self performSegueWithIdentifier:@"segue1" sender:myString];
, se rompe con el error
***** Terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', por: 'receptor() no tiene segue con identificador 'SEGUE1'' * pila de llamadas primer tiro: (0x14b4022 0xeb4cd6 0xdf61b 0x3590 0xa85c5 0xa87fa 0x93d85d 0x1488936 0x14883d7 0x13eb790 0x13ead84 0x13eac9b 0x139d7d8 0x139d88a 0x17626 0x23ed 0x2355 0x1) por terminado llama lanzar una excepción (LLDB)
No puedo entender por qué me dice que no puede encontrar segue1 cuando ya está definido en el guión gráfico y el código.
Puedo estar COMPLETAMENTE DESACTIVADO aquí, ya que no uso mucho, pero intento declarar 'DrillDownDetailController * dvController' como una variable de instancia y luego en' prepareForSegue' establecer las propiedades que necesite en el VC. No presione el VC al controlador de naval en la preparación y luego realice la búsqueda. – mkral
@mkral ¿podría dar más detalles sobre "No presione el VC al controlador de naval en la preparación y luego realice la búsqueda"? Entonces, ¿quita la línea pushViewController y coloca esa línea en una nueva función performSegue? – foboi1122
Agregaré una respuesta formateada. Si no funciona, con suerte alguien más puede venir, – mkral