2017-02-28 8 views
0

私のアプリケーションコードはかなり長いので、この問題を解決するにはコードの束を表示せずに解決したいと思っています....しかし、ここでは何が起こっているのですか...UITable UITextFieldが正しくデータを表示しないSWIFT 3.0

ダイナミックセルのテーブルビューはすべて正しく設定されています。セルにはテキストフィールドがあります。テキストフィールドにデータが入力されると、同じセル内のラベルにデータが送信されます。これは「完了」ボタンが押されたときに発生します。これは、テーブルに約6行追加されるまで、すべての動作が見つかります。その時点で、「完了」ボタンが押されると、データがすべて混ざり合ってしまいます。ときには、データが間違ったセルラベルに送信され、まったく送信しない場合もあります。これは、約6行になると発生します。私は非常に混乱しています。セルは、Core Dataのentity.countに基づいて表示されます。テキストフィールドにはデリゲートが設定されています。これを引き起こす可能性のあるものはありません... 6行後のみです。

ご協力いただきありがとうございます...私が言ったように、ここでコードを貼り付けないようにしたいと思いますが、もし私が何かを提供しなければならない場合や、コード...ここ

EDIT

は私がTHIを願ってセルの内容

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) 

       } 
      } 
     } 

にテキストフィールドを扱うことcellForRowAtの私のコードの一部であります助けてくれる、ありがとう

+1

データを格納するためにセルを使用しようとしているように見え、キャッシュされ再利用されているという事実によってキャッチされているようです。一般に、 "cellForRow ..."メソッドの外にあるセルの内容には何もしないで、そのメソッドの中に保存されたデータから** **完全に設定するのは安全です。 –

+1

問題に関連するコードを投稿してください。あなたの問題が発生しているコードの最小量を把握することは、根本的な原因に取り組むのにも役立ちます。手元の問題に関係しないプロパティをすべて削除します。問題を示す最小限のコードが得られるまで続けてください。これを調べるために、あなた自身の新しい一時的なプロジェクトを作成すると便利かもしれません。 –

+0

返事をありがとう。私のコードはすべて基本的にcellForRowメソッドの内部にあります。セル内でこれらのtextFieldを使用することは重要です。なぜなら、空白のままであるかどうかによって多くのことが起こるからです... – Bill

答えて

1

あなたが見ているのはUITableViewの再利用戦略の症状です。 UITextFieldに入力した情報をコレクションに保存してから、tableViewが「リロード」するたびに、そのコレクションから現在のindexPathを取り出して読み込みます。

+0

それはうまくいくかもしれない。どのようにindexPathに基づいて何らかのコレクションにデータを入れても、それを正しいセルにロードして使用することはできますか? – Bill

+0

パーフェクト。情報を入力していたtextFieldのindexPathに基づいて、キー値のペアを辞書に格納することができました。私はそれを取得しますが、小さな文字列トリッキーを使用してindexPath上のif文を呼び出す...それ以上の問題はありません。アドバイスありがとう! – Bill

1

このような行は、仕事に行くことはありません:

if cell.changeServingTextField.text == "" 

問題は、細胞がを再利用していることです。したがって、以前の人生では、テキストフィールドにテキストがある場合、それはまだテキストを持ち、テストは失敗します。

代わりに、ロジックは、これがどの行にあり、その行に対応するデータが何であるかに完全に基づいている必要があります。セルは再利用できるので、すべてのケースをカバーする必要があります。

0

このロジックのほとんどをセル自体に移してしまえば、より明確になります。まず、すべてのセルのIBOutletfileprivateにして、モデルオブジェクトまたは辞書をセルのプロパティとして割り当てます。そうすることで、ディスプレイからセルを作成するためのロジックを分離することができ、セルのアウトレットを使って状態を判断することができなくなります。

これで問題が直接解決されるわけではありませんが、論理を分けるとどこを見ているか分かります。

関連する問題