2017-02-28 5 views
0

Mein Anwendungscode ist ziemlich lang, also würde ich gerne versuchen, dieses Problem zu lösen, ohne einen Haufen Code zeigen zu müssen ... aber hier ist was los ist ..UITable UITextField zeigt Daten nicht korrekt an SWIFT 3.0

Ich habe eine Tabellenansicht mit dynamischen Zellen alle gut eingerichtet. In der Zelle befindet sich ein Textfeld. Wenn Daten in das Textfeld eingegeben werden, werden sie an ein Etikett in derselben Zelle gesendet. Dies geschieht, wenn eine "Fertig" -Taste gedrückt wird. Das alles funktioniert nur, bis ich etwa 6 Zeilen zur Tabelle hinzugefügt habe. An diesem Punkt, wenn der Knopf "Fertig" gedrückt wird, werden die Daten durcheinander gebracht. Manchmal werden die Daten an das falsche Zellenetikett gesendet und manchmal wird es überhaupt nicht gesendet. Dies geschieht nur, wenn ich zu ungefähr 6 Reihen komme. Ich bin sehr verwirrt. Die Zellen werden basierend auf einer Core Data entity.count angezeigt ... das Textfeld hat den Delegaten als selbst gesetzt .... Ich habe keine Ahnung, was das verursachen könnte ... erst nach 6 Zeilen !?

Vielen Dank im Voraus für Ihre Hilfe ... wie ich schon sagte, ich möchte versuchen und vermeiden, meinen Code hier einfügen, aber wenn ich einige zur Verfügung stellen muss, werde ich oder ich kann Ihnen durch erzählen, was in meinem passiert Code ...

EDIT

Hier einige meiner Code in cellForRowAt, die mit den Textfeldern in den Zellinhalt befasst

if searchResults.count > 1 { 
     if showInGrams { 
      if foods[indexPath.row].units != "g" && foods[indexPath.row].units != "grams" && foods[indexPath.row].units != "Grams" { 
       if cell.changeServingTextField.text == "" { 
        cell.labelServing.text = String(format: "%0.2f", (100/foods[indexPath.row].coefficient) * searchResults[indexPath.row].doubleValue) 
        cell.labelUOM.text = "grams" 
       } else { 
        if cell.changeServingSegmentedControl.selectedSegmentIndex == 0 { 
         cell.labelServing.text = String(format: "%0.2f", Double(cell.changeServingTextField.text!)!) 
         cell.labelUOM.text = cell.changeServingSegmentedControl.titleForSegment(at: 0) 
         //show default values 
        } else { 
         cell.labelServing.text = String(format: "%0.2f", Double(cell.changeServingTextField.text!)!) 
         cell.labelUOM.text = cell.changeServingSegmentedControl.titleForSegment(at: 1) 
        } 
       } 
      } else { 
       if cell.changeServingTextField.text == "" { 
        cell.labelServing.text = String(format: "%0.2f", searchResults[indexPath.row].doubleValue * foods[indexPath.row].serving) 
        cell.labelUOM.text = "grams" 
       } 
      } 
     } else { 
      if cell.changeServingTextField.text == "" { 
       cell.labelServing.text = String(format: "%0.2f", searchResults[indexPath.row].doubleValue * foods[indexPath.row].serving) 
       cell.labelUOM.text = foods[indexPath.row].units 
      } else { 
       if cell.changeServingSegmentedControl.selectedSegmentIndex == 0 { 
        cell.labelServing.text = String(format: "%0.2f", Double(cell.changeServingTextField.text!)!) 
        cell.labelUOM.text = cell.changeServingSegmentedControl.titleForSegment(at: 0) 
       } else { 
        cell.labelServing.text = String(format: "%0.2f", Double(cell.changeServingTextField.text!)!) 
        cell.labelUOM.text = cell.changeServingSegmentedControl.titleForSegment(at: 1) 

       } 
      } 
     } 

I thi hoffen s hilft, danke

+1

Es klingt, als ob Sie versuchen, Zellen für die Datenspeicherung zu verwenden und dadurch gefangen zu werden, dass sie zwischengespeichert und wiederverwendet werden. Im Allgemeinen ist es sicherer, niemals etwas mit dem Inhalt einer Zelle außerhalb der "cellForRow ..." -Methode zu tun und es ** vollständig ** aus gespeicherten Daten innerhalb dieser Methode zu konfigurieren. –

+1

Bitte geben Sie den für das Problem relevanten Code ein. Das Herausfinden der Mindestmenge an Code, für die Ihr Problem auftritt, kann Ihnen auch dabei helfen, die Ursache genauer zu untersuchen. Entfernen Sie alle Eigenschaften, die nicht mit dem vorliegenden Problem zusammenhängen. Machen Sie weiter, bis Sie das Minimum an Code haben, das das Problem anzeigt.Es könnte nützlich sein, ein neues temporäres Projekt zu erstellen, um dies zu untersuchen. –

+0

Danke für die Antwort. Mein gesamter Code befindet sich grundsätzlich in der Methode cellForRow ... es ist wichtig, diese textFields in der Zelle zu verwenden, da viel passiert, abhängig davon, ob sie leer gelassen werden oder nicht ... – Bill

Antwort

1

Was Sie sehen, ist ein Symptom der Wiederverwendungsstrategie UITableView. Vielleicht möchten Sie die in Ihrem UITextField eingegebenen Informationen in einer Sammlung speichern und jedes Mal, wenn Sie die tableView "neu lädt", diese aus der Sammlung für die aktuelle indexPath auswählen und laden.

+0

Das könnte funktionieren. Wie würde ich Daten basierend auf dem IndexPath in eine Art Sammlung aufnehmen und trotzdem in der Lage sein, sie in die richtige Zelle zu laden? – Bill

+0

Perfekt. Ich konnte Schlüsselwertpaare in einem Wörterbuch basierend auf dem indexPath des textField speichern, in das ich Informationen eingegeben habe. Ich rufe es ab, aber rufe eine if-Anweisung auf dem indexPath auf, indem ich eine kleine String-List verwende ... keine Probleme mehr. Danke für den Hinweis! – Bill

1

A wie diese Linie wird nie arbeiten:

if cell.changeServingTextField.text == "" 

Das Problem ist, dass die Zellen sind wiederverwendet. Wenn das Textfeld in seinem vorherigen Leben also Text enthielt, hat es immer noch Text und der Test wird fehlschlagen.

Stattdessen muss Ihre Logik vollständig darauf basieren, welche Zeile das ist und welche Daten dieser Zeile entsprechen. Und es muss jeden Fall abdecken, denn die Zelle kann wiederverwendet werden.

0

Die Dinge wären klarer, wenn Sie den Großteil dieser Logik in die Zellen selbst verschoben würden. Sie können beginnen, indem Sie alle IBOutlet s Ihrer Zelle fileprivate setzen und ein Modellobjekt oder ein Wörterbuch als eine Eigenschaft der Zelle zuweisen. Auf diese Weise trennen Sie die Logik zum Erstellen der Zellen von ihrer Anzeige - und verhindern, dass Sie mithilfe der Zellenausgänge den Status bestimmen.

Während dies Ihr Problem nicht direkt lösen könnte, könnte die Trennung der Logik klären, wo Sie suchen müssen.

Verwandte Themen