Ich habe eine UITable, die einige Zoll-UITableCells enthält. Diese Zellen enthalten einige UILabels und ein UITextField. Die Datenquelle der Tabelle stammt von der Eigenschaft eines Hauptcontrollers. (Dieser Controller ist auch der Delegat und die DataSource für die Tabelle.)
Hier ist ein vereinfachter Screenshot der Benutzeroberfläche:
[p>
Jetzt muss ich den Inhalt aller UILabels "on the fly" aktualisieren, wenn der Benutzer eines der UITextFields bearbeitet. Dazu am Ich höre das "Editing Changed" -Ereignis auf UITextField-Ebene. Dies löst folgende Aktion aus:
- (IBAction) editChangeHandler: (id) sender {
MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[[delegate.viewController.myDataSourceArray objectAtIndex:self.rowIndex] setANumber: [theTextField.text intValue]];
[delegate.viewController reloadRows];
}
Die reloadRows-Methode im viewController ist so:
- (void) reloadRows {
NSLog(@"called reloadRows");
//perform some calculations on the data source objects here...
[theUITable reloadData];
}
Mein Problem hier ist, dass die reloadRows-Methode immer dann aufgerufen wird, wenn der Benutzer den Wert im Feld ändert reloadData bewirkt jedoch auch, dass die Tastatur verworfen wird.
Am Ende kann der Benutzer beim Bearbeiten des TextFelds nur eine Taste berühren, bevor die Tastatur gelöscht und die Tabelle neu geladen wird.
Kennt jemand eine Lösung für dieses Problem oder ist das gleiche Problem aufgetreten?
Ich bin auf das gleiche Problem gestoßen. In meinem Fall habe ich versucht, einen generischen Controller zu erstellen. Daher war es keine gute Option, eine bestimmte Methode für die manuelle Neuerstellung der Zellen zu erstellen.
Hier ist die Lösung, die ich gefunden habe :
Es wirkt wie ein Zauber. Die Tastatur bleibt sichtbar, ohne zu blinken, die Zelle wird ordnungsgemäß aktualisiert, und der Benutzer kann in das Feld eingeben, in dem er ursprünglich bearbeitet wurde.
Sie können Zeilen nach Bedarf selektiv modifizieren, anstatt die gesamte Tabelle zu aktualisieren (dabei wird die Zelle aktualisiert, in der Sie gerade arbeiten, und der Status wird zurückgesetzt.)
Siehe:
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
Sie können diese Zellen auch direkt bearbeiten, indem Sie die Zelle über
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
, wenn Sie diese Zellen nicht neu erstellen möchten.