2011-05-24 8 views
29

¿Cómo puedo establecer una fila seleccionada de forma predeterminada? Quiero seleccionar una fila, tomar el número de la fila seleccionada con indexpath.row y luego volver a cargar la tabla y seleccionar la fila que fue seleccionada. ¿Puede alguien ayudarme por favor? ¿Puedo obtener la fila seleccionada en un método - (IBAction) segmentedControlIndexChanged? No en didSelectRowAtIndexPath?¿Cómo recordar las filas seleccionadas y mantenerlas después de volver a cargarlas por defecto en UITableView?

Este es mi código si puede ayudar a entender

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    //lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(200, 10, 100, 20) ]; 

    // Configure the cell... 
    NSString *depdateChoosed=[deparatureDates objectAtIndex:depSelectedIndice]; 
    NSString *comeateChoosed=[deparatureDates objectAtIndex:comSelectedIndice]; 
    NSString *choosedDate =[NSString stringWithFormat:@"%@%@",depdateChoosed, comeateChoosed]; 
    NSLog(@"date choisi %@ ",choosedDate); 

    if(segment.selectedSegmentIndex==0) 
    { 
     cell.textLabel.text =[deparatureDates objectAtIndex:indexPath.row];   
    } 
    else if(segment.selectedSegmentIndex==1) { 
     //cell.textLabel.text =[goingBackDates objectAtIndex:indexPath.row]; 
     //cell.textLabel.text=[goingBackDates objectAtIndex:indexPath.row]; 
     cell.textLabel.text =[goingBackDates objectAtIndex:indexPath.row]; 
    } 
    return cell; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@" champ séléctionner : %d ",indexPath.row); 

    if(segment.selectedSegmentIndex==0) 
    { 
     depSelectedIndice=indexPath.row; 
    } 
    else if(segment.selectedSegmentIndex==1) { 
     comSelectedIndice=indexPath.row; 
    } 
    //[tableView reloadData]; 
} 

-(IBAction) segmentedControlIndexChanged 
{ 
    int i; 
    switch (self.segment.selectedSegmentIndex) 
    { 
     case 0: 
      i=0; 

      [tableView reloadData]; 
      break; 
     case 1: 
      i=1; 
      NSLog(@"dexieme segment selectionner"); 
      [tableView reloadData]; 
     default: 
      break; 
    } 
} 

Respuesta

64
NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 

le dará la NSIndexPath para la fila seleccionada actual. A continuación, puede hacer

[tableView selectRowAtIndexPath:indexPath 
         animated:NO 
       scrollPosition:UITableViewScrollPositionMiddle]; 

para seleccionar esa fila (y mostrarla en el medio de la pantalla) más adelante.

+0

método NSIndexPath indexPath = [tableView indexPathForSelectedRow]; no puede devolver int? – user567

+0

error tipográfico, lo siento. es un puntero a una ruta de índice. –

+26

Además, asegúrese de tener 'clearsSelectionOnViewWillAppear' en su' UITableViewController' establecido en 'NO', de lo contrario, desactivará automáticamente la fila cuando aparezca la vista. Esto me estaba molestando por horas. – cheeesus

5

Esta es la forma de preseleccionar una fila en una UITableView:

[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition: UITableViewScrollPositionNone]; 

Establecer la indexPath ser la fila que desea seleccionado y luego hacer la llamada al método que el anterior.

+0

gracias pero no puedo usar int? tableView selectRowAtIndexPath: 3? – user567

+0

NO PUEDE usar un número entero. DEBE pasar un indexPath, como se muestra en muchas respuestas aquí. Espero que ayude a alguien. – Fattie

9

Esto se hace:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section]; 
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition: UITableViewScrollPositionNone]; 

Dónde fila es el número de células que desea seleccionar (comienza ... 0), y la sección de es la sección donde aparece la célula.

+0

Tuve un 'UITableView' con +130 filas y esto funcionó para mí. Lo llamo en 'viewWillAppear'. +1 gracias – youssman

30

que tenían la misma pregunta, y esto es cómo lo hice:

En su tableViewController, añadir en esta función

(UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    if(indexPath.row == 'the row you want to select') 
    { 
     [tableView 
      selectRowAtIndexPath:indexPath 
      animated:TRUE 
      scrollPosition:UITableViewScrollPositionNone 
     ]; 

     [[tableView delegate] 
      tableView:tableView 
      didSelectRowAtIndexPath:indexPath 
     ]; 

    } 

} 
+1

gracias ... funcionó para mí – Ronak

+0

Sí, al seleccionar una celda de esta manera, cuando se maneja a la vista de tabla, asegura que se seleccionará incluso si llama a [reloadData]. Esto parece funcionar mejor que implementarlo en [viewWillAppear]. ¡Gracias! – pimguilherme

+0

Esta es la única solución si la vista de tabla aparece animada. ¡No seleccione las celdas predeterminadas en viewDidLoad/viewDidAppear! – iOSdev

4

Soy consciente de que esta pregunta es bastante antiguo (2011), pero solo para publicar una respuesta actualizada, en caso de que alguien (como yo) busque este problema y tropiece con esta pregunta:

Con iOS 9, Apple ha mejorado mucho UITableView. Para asegurarse de que el foco no se pierde cuando se vuelve a cargar una mesa, simplemente hacer esto:

tableView.remembersLastFocusedIndexPath = Yes; 

y va a "trabajar mágicamente".

Aún mejor, implementar

- (NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView 

en el UITableViewDelegate para dejar la mesa sé a qué fila que desea seleccionado cuando se dibuja en la pantalla por primera vez.

Antes de iOS 9, generalmente escribía mi propio método reloadData, que obtiene la fila seleccionada en ese momento, vuelve a cargar la tabla y luego la selecciona de nuevo. Ya sea en el UITableViewController o si necesitaba eso para trabajar con una tabla donde no pude evitar el código directamente llamando a reloadData, subclassed UITableView y sobreescribí reloadData (hey, la delegación es la forma preferida, pero a veces solo tienes que subclase y anular, incluso en iOS).

0

Utilice el siguiente código para obtener las filas seleccionadas en una vista de tabla. :)

NSArray *selectedRows=[tableView indexPathsForSelectedRows]; 
     NSMutableArray *rownumberArray=[[NSMutableArray alloc]init]; 
     for (int i=0; i<selectedRows.count; i++) { 
      NSIndexPath *indexPath = [selectedRows objectAtIndex:i]; 
      NSInteger row = indexPath.row; 
      NSNumber *number = [NSNumber numberWithInteger:row]; 
      [rownumberArray addObject:number]; 
     } 

// rownumberArray contiene los números de fila de las celdas seleccionadas.

+0

Puede simplificar esto un poco usando 'for (NSIndexPath * ip en selectedRows) [rowNumberArray addObject: @ (ip.row)];' – Koen

Cuestiones relacionadas