Laden Sie eine UITable sofort, wenn Sie ein UITextField in einer der Zellen bearbeiten

  • 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> Laden Sie eine UITable sofort, wenn Sie ein UITextField in einer der Zellen bearbeiten

    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?

    22 November 2011
    Adam Wenger
2 answers
  • 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 :

    1. Lassen Sie vorübergehend ein Textfeld in einer anderen Zelle der Tabelle als Ersthelfer festlegen.
    2. Rufen Sie reloadRowsAtIndexPaths an Laden Sie die Zelle, die Ihr Benutzer gerade bearbeitet hat, neu.
    3. Legen Sie das Feld, das der Benutzer bearbeitet hat, erneut als Ersthelfer fest.

    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.

    04 February 2012
    Alan Keele
  • 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.

    22 November 2011
    MarkPowell