2011-11-15 17 views
98

Estoy usando guiones gráficos y tengo una UITableView. Tengo una configuración de segue que empuja desde mi mesa al detalle VC. ¿Pero qué método debo usar para manejar esto? Tendré que pasar un par de objetos a la vista de detalle. ¿Pero uso didSelectRowAtIndex o -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender?Utilice el método didSelectRowAtIndexPath o prepareForSegue para UITableView?

Respuesta

194

Si usa prepareForSegue:sender:, entonces no tendrá tanto que cambiar si más tarde decide desencadenar la transición desde algún control fuera de la vista de tabla.

prepareForSegue:sender: El mensaje se envía al controlador de vista actual, por lo que te sugiero algo como esto:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Assume self.view is the table view 
    NSIndexPath *path = [self.tableView indexPathForSelectedRow]; 
    DetailObject *detail = [self detailForIndexPath:path]; 
    [segue.destinationViewController setDetail:detail]; 
} 

En Swift:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let path = self.tableView.indexPathForSelectedRow()! 
    segue.destinationViewController.detail = self.detailForIndexPath(path) 
} 
+1

Ok, ¿Puede dar un ejemplo de cómo implementarlo con el paso de un objeto basado en indexPath. – Jon

+0

He actualizado mi respuesta. –

+4

no debería 'self.view' ser simplemente' remitente' aquí? Ni siquiera pude hacer que '[self.view indexPathForSelectedRow]' funcionara, tuve que hacer '[sender indexPathForSelectedRow];' – ladookie

5

lo hice y funcionó

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

    NSLog(@"Row Selected = %i",indexPath.row); 

    [self performSegueWithIdentifier:@"testID" sender:self.view];  
} 
+11

Eso no tiene sentido. Debe usar el delegado o el delegado de la vista de tabla. Simplemente crea un segue de la Celda y automáticamente realizará lo mismo que hiciste sin escribir código. – Yariv

+3

¿cómo se asigna una segue a una celda sin didSelectRow? – Morkrom

0

Si usa prepareForSegue: puede verificar quién es el remitente y ejecutar diferentes c oda

Por ejemplo, en rápida

override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?) 
{ 
    var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell) 

    if senderIsTableviewCell 
    { 
     //do something 
    } 
} 
+2

Simplemente hazlo: * if let tableViewCell = sender as?UITableViewCell {// hacer algo} *. Si el remitente no puede enviarse a una UITableViewCell, "no hacer algo" no se ejecutará. – mbeaty

1

si su propiedad tableView está en otra clase y que sólo tienen una sección de, entonces usted podría utilizar la propiedad tag para almacenar la fila de la celda como:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    cell.tag = indexPath.row; 

    return cell; 
} 

Y entonces se puede acceder a él como el sender es la misma celda con el valor de la fila en su etiqueta:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    MyDestinationViewController *destinationViewController = segue.destinationViewController; 
    destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell 
} 
3

Cuando el remitente es UITableViewCell, puede solicitar a UITableView que consulte indexPath de la celda.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let cell = sender as? UITableViewCell { 
      let indexPath = self.tableView.indexPathForCell(cell)! 
      assert(segue.destinationViewController.isKindOfClass(DetailViewController)) 
      let detailViewController = segue.destinationViewController as! DetailViewController 
      detailViewController.item = self.items[indexPath.row] // like this 
     } 
    } 
1

Si celular remitente no es seleccionable, self.tableView.indexPathForSelectedRow rendimientos seleccionados celular, pero no segue celular remitente. La mejor manera es conseguir indexPath para el remitente segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    ((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender]; 
} 

En Swift:

override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
  
    (segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender) 
} 
Cuestiones relacionadas