web-dev-qa-db-fra.com

Comment mémoriser les lignes sélectionnées et les conserver après rechargement par défaut dans UITableView?

Comment définir une ligne sélectionnée par défaut? Je veux sélectionner une ligne, prenez le nombre de lignes sélectionnées avec indexpath.row, puis rechargez le tableau et sélectionnez la ligne qui a été sélectionnée. Quelqu'un peut-il m'aider s'il vous plaît? Puis-je obtenir la ligne sélectionnée dans une méthode - (IBAction) segmentedControlIndexChanged? Pas dans didSelectRowAtIndexPath?

Ceci est mon code s'il peut vous aider à comprendre

- (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;
    }
}
29
user567
NSIndexPath *indexPath = [tableView indexPathForSelectedRow];

vous donnera le NSIndexPath pour la ligne actuellement sélectionnée. Vous pouvez alors faire

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

pour sélectionner cette ligne (et l'afficher au milieu de l'écran) plus tard.

64
Seamus Campbell

J'avais la même question, et voici comment je l'ai fait:

Dans votre tableViewController, ajoutez ceci dans cette fonction

(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
        ];

    }

}
30
xlsmearlx

Cela le fera:

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

ligne est le numéro de cellule que vous souhaitez sélectionner (commence 0 ...), et section est la section où la cellule apparaît.

9
Nuno Costa

Voici comment vous présélectionnez une ligne dans un UITableView:

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

Définissez indexPath pour être la ligne que vous souhaitez sélectionner, puis effectuez l'appel de méthode comme ci-dessus.

5
mahboudz

Je me rends compte que cette question est assez ancienne (2011), mais juste pour publier également une réponse à jour, au cas où quelqu'un (comme moi) recherche ce problème et tombe sur cette question:

Avec iOS 9, Apple a beaucoup amélioré UITableView. Pour vous assurer que le focus n'est pas perdu lors du rechargement d'une table, procédez comme suit:

tableView.remembersLastFocusedIndexPath = Yes;

et cela "fonctionnera comme par magie".

Encore mieux, implémentez

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

dans le UITableViewDelegate pour indiquer au tableau la ligne que vous souhaitez sélectionner lors de son premier affichage à l'écran.

Avant iOS 9, j'écrivais généralement ma propre méthode reloadData, qui obtient la ligne actuellement sélectionnée, recharge la table, puis la sélectionne à nouveau. Soit dans le UITableViewController ou si j'avais besoin de cela pour travailler avec une table où je ne pouvais pas empêcher le code d'appeler reloadData directement, j'ai sous-classé UITableView et remplacé reloadData (hé, délégation est la méthode préférée, mais il suffit parfois de sous-classer et de remplacer, même dans iOS).

4
Mecki

Utilisez le code suivant pour obtenir les lignes sélectionnées dans une vue de table. :)

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 contient les numéros de ligne des cellules sélectionnées.

0
karthikc217