2009-12-03 4 views
8

Ich möchte die textLabel und detailTextLabel einer Zelle ändern, wenn es ausgewählt wurde. Ich habe folgendes versucht, aber keine Änderung eintritt:Wie ändern Sie die TextLabel, wenn UITableViewCell ausgewählt ist?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyAppDelegate *appDelegate = (MyPhoneAppDelegate*)[[UIApplication sharedApplication] delegate]; 

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    cell.detailTextLabel.text = @"xxxxx"; 
    cell.textLabel.text =  @"zzzzz"; 
    [tableView reloadData]; 
} 

Antwort

-1

Haben Sie versucht, nur die ausgewählte Zelle zu aktualisieren, anstatt die gesamte Tabelle neu zu laden?

[cell setNeedsDisplay];

statt

[tableView reloadData];

Diese bessere Leistung haben wird, und ich bin nicht aber ich nehme an, dass die Auswahl verloren geht, wenn Sie die gesamte Tabelle aktualisieren (dies kann der Grund sein, warum Sie sehen keine Änderung am Ende) ....

+0

zu nennen Was ist, wenn Sie eine benutzerdefinierte Zellenansicht verwenden? – meridimus

+0

Eine benutzerdefinierte Zellenansicht ist eine Ansicht, die auf die contentView einer UITableViewCell gesetzt ist, also ist das das Gleiche, das setNeedsDisplay wird die contentView neu zeichnen. – yonel

2

Sie sollten nicht versuchen, die Tabelle neu zu laden, während eine Zelle ausgewählt ist. Stattdessen versuchen

[Zelle setNeedsLayout]

, nachdem Sie die oben genannten Änderungen auf die Etiketten zu machen.

Gibt es auch einen Grund, warum Sie in der Methode auf den App-Delegaten verweisen?

+0

Das hat perfekt für mich funktioniert. Vielen Dank! – Nick

10

Ich bin damit einverstanden, wird die Tabellen-Ansicht Nachladen tatsächlich Dump und laden/Anzeige aller Zellen tableView:cellForRowAtIndexPath: verwenden und die Originaldaten zu verwenden, nicht die @ „xxxxx“ aktualisiert und @ „yyyyy“ in Ihrer tableView:didSelectRowAtIndexPath: Methode.

In einem kleinen Testprojekt konnte ich mit der Etiketten bei der Auswahl ändern:

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

    UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath]; 
    cell.textLabel.text = @"it was tapped"; 
} 
0

Erstellen eines neuen iPad-Projekt (Split View) und jetzt die Classes-> Dateien durchlaufen. Der einfachste Weg ist dort gegeben worden. Die von XCode generierten Codes.

Beispielcode Linien: -

cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row]; 

Sie können sie in cellForRowAtIndexPath ||&& didSelectRowAtIndexPath ..

2

Versuchen verwenden, um die Zelle, die Sie ausgewählt (beschrieben von indexPath) erneut zu laden:

[yourTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
0

nicht sicher, was Sie Ich versuche, mit dem Delegaten zu versuchen, aber Sie sollten versuchen, die bereits instantiierte TabelleView aufzurufen; dh rufen

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath: indexPath]; 

Vielleicht bin ich nicht klar Was ich sagen will ist, dass Sie eine neue leere Tabellenansicht sind Instanziieren

UITableViewCell *cell = [**tableView** cellForRowAtIndexPath: indexPath]; //cell has nothing it is new. 

betrachten ersetzt die alte

UITableViewCell *cell = [**self.tableView** cellForRowAtIndexPath: indexPath]; //now you have one that has a textField already in it 
+0

Siehst du was ich sage? Sie erstellen eine neue Instanz, nicht die alte. –

+0

Wenn Sie eine neue erstellen, müssen Sie Daten neu laden, um sie in der Tabellenansicht anzuzeigen. Wenn Sie den alten verwenden, spiegelt die Ansicht die Änderungen wider. –