30 Stimmen

Wie kann man sich ausgewählte Zeilen merken und sie nach dem Neuladen standardmäßig in UITableView beibehalten?

Wie kann ich eine standardmäßig ausgewählte Zeile festlegen? Ich möchte eine Zeile auswählen, die Nummer der ausgewählten Zeile mit indexpath.row und laden Sie dann die Tabelle neu und wählen Sie die Zeile aus, die ausgewählt wurde. Kann mir bitte jemand helfen? Kann ich die ausgewählte Zeile in einer Methode erhalten -( IBAction ) segmentedControlIndexChanged ? Nicht in didSelectRowAtIndexPath ?

Dies ist mein Code, wenn er Ihnen helfen kann, zu verstehen

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

64voto

Seamus Campbell Punkte 17568
NSIndexPath *indexPath = [tableView indexPathForSelectedRow];

wird Ihnen die NSIndexPath für die aktuell ausgewählte Zeile. Sie können dann

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

um diese Zeile später auszuwählen (und in der Mitte des Bildschirms anzuzeigen).

31voto

xlsmearlx Punkte 608

Ich hatte die gleiche Frage, und so habe ich es gemacht:

In Ihrem tableViewController fügen Sie dies in dieser Funktion hinzu

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

    }

}

9voto

Nuno Costa Punkte 423

Das wird genügen:

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

Dónde rangée ist die Nummer der Zelle, die Sie auswählen möchten (beginnt mit 0...), und Abschnitt ist der Abschnitt, in dem die Zelle erscheint.

5voto

mahboudz Punkte 39008

So wird eine Zeile in einer UITableView vorausgewählt:

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

Legen Sie als indexPath die Zeile fest, die Sie auswählen möchten, und führen Sie dann den Methodenaufruf wie oben aus.

4voto

Mecki Punkte 113876

Mir ist klar, dass diese Frage ziemlich alt ist (2011), aber ich wollte nur eine aktuelle Antwort posten, für den Fall, dass jemand (wie ich) nach diesem Problem sucht und über diese Frage stolpert:

Mit iOS 9 hat Apple folgende Verbesserungen vorgenommen UITableView eine Menge. Um sicherzustellen, dass der Fokus nicht verloren geht, wenn eine Tabelle neu geladen wird, tun Sie einfach Folgendes:

tableView.remembersLastFocusedIndexPath = Yes;

und es wird "magisch funktionieren".

Noch besser, implementieren Sie

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

im UITableViewDelegate um der Tabelle mitzuteilen, welche Zeile ausgewählt werden soll, wenn sie zum ersten Mal auf dem Bildschirm angezeigt wird.

Vor iOS 9 habe ich normalerweise einfach meine eigene reloadData Methode, die die aktuell ausgewählte Zeile abruft, die Tabelle neu lädt und sie dann erneut auswählt. Entweder in der UITableViewController oder wenn ich das für eine Tabelle bräuchte, bei der ich nicht verhindern kann, dass der Code reloadData direkt zu verwenden, habe ich UITableView unterklassifiziert und die reloadData (Hey, Delegation ist der bevorzugte Weg, aber manchmal muss man einfach unterklassifizieren und überschreiben, sogar in iOS).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X