2012-04-15 7 views
6

Cuando hago clic en un elemento de una determinada lista en mi UITableView, quiero pasar el índice del elemento que hice clic en la siguiente vista detallada.Número de índice de pase entre la lista de UITableView segue

Este es mi código en cuestión hasta el momento:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    HomeworkDetails *view = [[HomeworkDetails alloc] init]; 


    int lastIndex = [indexPath indexAtPosition:[indexPath length] - 1]; 
    NSLog(@"%u", lastIndex); 

    [self performSegueWithIdentifier: @"HomeworkDetailsSegue" sender:self]; 
    view.currentIndex = lastIndex; 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

} 

En este punto, puedo avanzar con éxito a la siguiente ViewController (HomeworkDetails) pero la información no se pasa a través. Estoy tratando de lograr esto haciendo view.currentIndex = lastIndex; pero esto no está funcionando. ¿De qué otra manera puedo hacer esto? Perdón si me perdí algo; Soy un principiante en el desarrollo de iOS.

Con sugerencias:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 


    HomeworkDetails *view = [[HomeworkDetails alloc] init]; 


    int lastIndex = [indexPath indexAtPosition:[indexPath length] - 1]; 
    NSLog(@"%u", lastIndex); 

    [self performSegueWithIdentifier: @"HomeworkDetailsSegue" sender:self]; 
    view.currentIndex = lastIndex; 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 



} 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"HomeworkDetailsSegue"]) { 

     // note that "sender" will be the tableView cell that was selected 
     UITableViewCell *cell = (UITableViewCell*)sender; 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; //**error** 


     HomeworkDetails *vc = (HomeworkDetails*)[segue destinationViewController]; 
     vc.currentIndex = indexPath.row; 
    } 
} 

Error from Compiler

+0

¿El 'currentIndex' está destinado a ser una propiedad en su controlador tableView o en el viewController de destino de segue? – jonkroll

+0

es una propiedad en el ViewController de destino. perdón por la confusion. Además, para probar, básicamente estoy configurando un TextView en el controlador de destino para esta propiedad, pero siempre es 0. – Kgrover

Respuesta

18

Lo que está describiendo se puede hacer mejor en el método prepareForSegue:sender:, en lugar de didSelectRowAtIndexPath:. En su guión gráfico, asegúrese de que su transición de HomeworkDetailsSegue esté configurada entre la celda prototipo de su tableView y el controlador de vista de destino.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{  
    if ([segue.identifier isEqualToString:@"HomeworkDetailsSegue"]) { 

     // note that "sender" will be the tableView cell that was selected 
     UITableViewCell *cell = (UITableViewCell*)sender; 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

     HomeworkDetails *vc = (HomeworkDetails*)[segue destinationViewController]; 
     vc.currentIndex = indexPath.row; 
    } 
} 

También, como una cuestión de estilo, recomendaría cambiar el nombre de la clase HomeworkDetails a HomeworkDetailsViewController. Hacer esto sigue las convenciones de Apple más de cerca y aclara lo que representa la clase.

+0

Aparece un error en esta línea: 'self.tableView indexPathForCell: cell];' y el compilador dice que tableView no es una propiedad de la interfaz actual. y también, ¿qué quiere decir con "asegúrese de que esté configurado entre las celdas de su tableView y el controlador de vista de destino" sospecho que este podría ser el problema; a partir de ahora, la transición es entre mi actual ViewController y el nextViewController ... ¿cómo lo hago desde el tableView en su lugar? – Kgrover

+0

El método 'prepareForSegue:' debe formar parte de la clase de su controlador de tabla, no de la clase HomeworkDetails. En cuanto a la configuración de la transición, haga clic en la celda del prototipo de su tabla en el guión gráfico para que se seleccione la celda. A continuación, mantenga presionada la tecla Control mientras arrastra desde esa celda hasta su controlador de vista de destino. Finalmente, configure la etiqueta Identificador para su segue en el inspector de propiedades en "HomeworkDetailsSegue". – jonkroll

+0

Es parte de mi clase original como creo que debería ser. Es en la clase donde originalmente inicié mi transición. Todo lo que digo es que ahora la transición va desde ViewController -> Destination ViewController en el guión gráfico. ¿Es así o debería ser desde UITableView -> Destination ViewController y cómo lo hago? Además, el error que está dando es que Property indexPathForCell no se encuentra en el objeto de tipo "HomeworkPage". HomeworkPage es mi ViewController original que contiene el tableView. – Kgrover

0

Debe establecer la propiedad de índice en la nueva vista antes de haber hecho la transición a ella con performSegueWityIdentifier. Y para ir un paso más allá, la convención de codificación de mejores prácticas requiere la configuración de la nueva vista utilizando el método estándar prepareForSegue.

Cuestiones relacionadas